<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Another fast fixed-point sine approximation</title>
	<atom:link href="http://www.coranac.com/2009/07/sines/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coranac.com/2009/07/sines/</link>
	<description>my own little world</description>
	<lastBuildDate>Mon, 30 Aug 2010 15:42:13 -0400</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Albert Redditt</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2911</link>
		<dc:creator>Albert Redditt</dc:creator>
		<pubDate>Sun, 03 Jan 2010 05:46:16 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2911</guid>
		<description>written in freebasic from http://www.freebasic.net
FBIDE is available on the links page so you can just cut and paste the code and hit &#039;f5&#039; to run it.


#define Bignum Double  &#039; implement your bignum maths for these variables

Function Cosine(Byval x As Bignum) As Bignum
    &#039; start with bignum in x
    Dim As Bignum mxs, term, sigma, last_sigma, divisor
    Dim As Integer n
    mxs = x * x     &#039; precompute
    mxs = - mxs     &#039; minus x squared
    term =  1.00
    sigma = 1.00
    n = 0   &#039; the only freebasic integer used
    Do
        n = n + 2               &#039; very fast integer math
        divisor = (n * (n-1))   &#039; use str(n * (n-1)) to convert integer to bignumber
        last_sigma = sigma      &#039; keep a copy of the last sigma
        term = term * mxs
        term = term / divisor
        sigma = sigma + term 
    Loop Until last_sigma = sigma   &#039; test if no change to sigma
    Return sigma
End Function

Function Sine(Byval x As Bignum) As Bignum
    &#039; start with bignum in x
    Dim As Bignum mxs, term, sigma, last_sigma, divisor
    Dim As Integer n
    mxs = x * x     &#039; precompute
    mxs = - mxs     &#039; minus x squared
    term =  1.00
    sigma = 1.00
    n = 1   &#039; the only freebasic integer used
    Do
        n = n + 2               &#039; very fast integer math
        divisor = (n * (n-1))   &#039; use str(n * (n-1)) to convert integer to bignumber
        last_sigma = sigma      &#039; keep a copy of the last sigma
        term = term * mxs
        term = term / divisor
        sigma = sigma + term 
    Loop Until last_sigma = sigma   &#039; test if no change to sigma
    sigma = x/ (1/sigma)
    Return sigma
End Function

&#039;work functions
dim as double deg,c,s
for deg = 0 to 360
    dim as double rad = atn(1)/45
    c = Cosine(deg*rad)
    s = Sine(deg*rad)
    print deg ;&quot; - &quot; ;  s ; &quot; - &quot; ; c ; &quot; - &quot; ; atan2(s,c)/rad 
next deg

sleep</description>
		<content:encoded><![CDATA[<p>written in freebasic from <a href="http://www.freebasic.net" rel="nofollow">http://www.freebasic.net</a><br />
 FBIDE is available on the links page so you can just cut and paste the code and hit &#8216;f5&#8242; to run it.</p>
<p> #define Bignum Double  &#8216; implement your bignum maths for these variables</p>
<p> Function Cosine(Byval x As Bignum) As Bignum<br />
     &#8216; start with bignum in x<br />
     Dim As Bignum mxs, term, sigma, last_sigma, divisor<br />
     Dim As Integer n<br />
     mxs = x * x     &#8216; precompute<br />
     mxs = &#8211; mxs     &#8216; minus x squared<br />
     term =  1.00<br />
     sigma = 1.00<br />
     n = 0   &#8216; the only freebasic integer used<br />
     Do<br />
         n = n + 2               &#8216; very fast integer math<br />
         divisor = (n * (n-1))   &#8216; use str(n * (n-1)) to convert integer to bignumber<br />
         last_sigma = sigma      &#8216; keep a copy of the last sigma<br />
         term = term * mxs<br />
         term = term / divisor<br />
         sigma = sigma + term<br />
     Loop Until last_sigma = sigma   &#8216; test if no change to sigma<br />
     Return sigma<br />
 End Function</p>
<p> Function Sine(Byval x As Bignum) As Bignum<br />
     &#8216; start with bignum in x<br />
     Dim As Bignum mxs, term, sigma, last_sigma, divisor<br />
     Dim As Integer n<br />
     mxs = x * x     &#8216; precompute<br />
     mxs = &#8211; mxs     &#8216; minus x squared<br />
     term =  1.00<br />
     sigma = 1.00<br />
     n = 1   &#8216; the only freebasic integer used<br />
     Do<br />
         n = n + 2               &#8216; very fast integer math<br />
         divisor = (n * (n-1))   &#8216; use str(n * (n-1)) to convert integer to bignumber<br />
         last_sigma = sigma      &#8216; keep a copy of the last sigma<br />
         term = term * mxs<br />
         term = term / divisor<br />
         sigma = sigma + term<br />
     Loop Until last_sigma = sigma   &#8216; test if no change to sigma<br />
     sigma = x/ (1/sigma)<br />
     Return sigma<br />
 End Function</p>
<p> &#8216;work functions<br />
 dim as double deg,c,s<br />
 for deg = 0 to 360<br />
     dim as double rad = atn(1)/45<br />
     c = Cosine(deg*rad)<br />
     s = Sine(deg*rad)<br />
     print deg ;&#8221; &#8211; &#8221; ;  s ; &#8221; &#8211; &#8221; ; c ; &#8221; &#8211; &#8221; ; atan2(s,c)/rad<br />
 next deg</p>
<p> sleep</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Albert Redditt</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2905</link>
		<dc:creator>Albert Redditt</dc:creator>
		<pubDate>Fri, 01 Jan 2010 04:20:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2905</guid>
		<description>&#039;Here is my attempt to calculate the hypotenuse &quot;C&quot; of the angles 0 to 45
&#039;Written in freebasic from http://www.freebasic.net

&#039;attempt to duplicate 
&#039; tangent * half tangent 
&#039; to figure the hypotenuse &quot;C&quot; of the angle

dim as double rad = atn(1)/45
dim as double y1,y2,y3,formula
dim as double deg
print &quot;deg      hypotenuse          my formula             error level&quot;
for deg = 0 to 45 step 1

    y1=tan(deg*rad)
    y2=tan(deg/2*rad)
    
    y3 = 1+ (y1*y2)  &#039; y1*y2 = hypot length between circle and square of 1  
    
    formula = 1+1/(( 1 / ((deg*rad) *(deg/2*rad)) ) -  (sqr(.69999)-.00019088303*deg))

    print deg ; &quot; - &quot; ; y3 ;&quot; - &quot; ; formula ; &quot; - &quot; ; formula - y3

next deg

sleep
&#039;Where tan(deg*rad) * tan(deg/2*rad) + 1 = hypotenuse of tangent</description>
		<content:encoded><![CDATA[<p>&#8216;Here is my attempt to calculate the hypotenuse &#8220;C&#8221; of the angles 0 to 45<br />
 &#8216;Written in freebasic from <a href="http://www.freebasic.net" rel="nofollow">http://www.freebasic.net</a></p>
<p> &#8216;attempt to duplicate<br />
 &#8216; tangent * half tangent<br />
 &#8216; to figure the hypotenuse &#8220;C&#8221; of the angle</p>
<p> dim as double rad = atn(1)/45<br />
 dim as double y1,y2,y3,formula<br />
 dim as double deg<br />
 print &#8220;deg      hypotenuse          my formula             error level&#8221;<br />
 for deg = 0 to 45 step 1</p>
<p>     y1=tan(deg*rad)<br />
     y2=tan(deg/2*rad)</p>
<p>     y3 = 1+ (y1*y2)  &#8216; y1*y2 = hypot length between circle and square of 1  </p>
<p>     formula = 1+1/(( 1 / ((deg*rad) *(deg/2*rad)) ) &#8211;  (sqr(.69999)-.00019088303*deg))</p>
<p>     print deg ; &#8221; &#8211; &#8221; ; y3 ;&#8221; &#8211; &#8221; ; formula ; &#8221; &#8211; &#8221; ; formula &#8211; y3</p>
<p> next deg</p>
<p> sleep<br />
 &#8216;Where tan(deg*rad) * tan(deg/2*rad) + 1 = hypotenuse of tangent</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Albert Redditt</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2802</link>
		<dc:creator>Albert Redditt</dc:creator>
		<pubDate>Tue, 15 Dec 2009 04:52:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2802</guid>
		<description>Here is my tangent approximation its accurate to .0688 at 35 degrees not good over 45deg it needs 97degrees to get vertical.

atn(1)/ ( atn(1)/ (deg*( atn(1)/45) ) - ((1 - atn(1))/45*deg) )</description>
		<content:encoded><![CDATA[<p>Here is my tangent approximation its accurate to .0688 at 35 degrees not good over 45deg it needs 97degrees to get vertical.</p>
<p> atn(1)/ ( atn(1)/ (deg*( atn(1)/45) ) &#8211; ((1 &#8211; atn(1))/45*deg) )</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Albert Redditt</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2743</link>
		<dc:creator>Albert Redditt</dc:creator>
		<pubDate>Tue, 08 Dec 2009 05:43:27 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2743</guid>
		<description>This was written like my others in FreeBasic from http://www.freebasic.net
Its a simple rule of thumb that is good to 2 decimal places (off by .003... at 45 degrees.)
generally = angle + opposite angle / ( 90 + (primary angle /8) )

For deg = 0 To 90 Step 1
    
    if deg &lt;=45 then 
        sine   =( (deg*1.5) / (90+(deg/8) ) )
        cosine = sqr(1-s*s)
    else
        cosine = ( ((90-deg)*1.5) / (90+((90-deg)/8)) )
        sine   = sqr(1-c*c)
    end if

    x=radius*c
    y=radius*s

    line(xctr,yctr)-(x, y),14

next deg</description>
		<content:encoded><![CDATA[<p>This was written like my others in FreeBasic from <a href="http://www.freebasic.net" rel="nofollow">http://www.freebasic.net</a><br />
 Its a simple rule of thumb that is good to 2 decimal places (off by .003&#8230; at 45 degrees.)<br />
 generally = angle + opposite angle / ( 90 + (primary angle /8) )</p>
<p> For deg = 0 To 90 Step 1</p>
<p>     if deg &lt;=45 then<br />
         sine   =( (deg*1.5) / (90+(deg/8) ) )<br />
         cosine = sqr(1-s*s)<br />
     else<br />
         cosine = ( ((90-deg)*1.5) / (90+((90-deg)/8)) )<br />
         sine   = sqr(1-c*c)<br />
     end if</p>
<p>     x=radius*c<br />
     y=radius*s</p>
<p>     line(xctr,yctr)-(x, y),14</p>
<p> next deg</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cearn</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2582</link>
		<dc:creator>cearn</dc:creator>
		<pubDate>Sun, 08 Nov 2009 19:08:07 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2582</guid>
		<description>&lt;p&gt;
* &lt;i&gt;dons Professor cap.&lt;/i&gt;
&lt;/p&gt;[br]

&lt;p&gt;
Albert, I appreciate what you&#039;re trying to do here, but your approach to the subject could use some work. Your expressions are way too complicated, and using more or less random angular units. This makes it very hard to see what they actually say. Also, you&#039;re not stating the reasons behind the coefficients, nor doing proper error analysis; with the exception of Richard&#039;s, the expressions are worse than the ones in the article.
&lt;/p&gt;
&lt;p&gt;
First, here are the expressions again, but compressed to their essentials. I will use the coordinate transformation &lt;i&gt;z&lt;/i&gt;[=]&lt;i&gt;x&lt;/i&gt;/(&#189;&#960;), because having the boundaries at 0.0 and 1.0 makes things much easier to analyse. Note how much smaller they are. 
&lt;/p&gt;

[eq][tex]
\begin{eqnarray}
  S_{a1}(z) &amp;=&amp; az - bz^2					\hspace{20} 
		&amp; a = \sqrt{2}(1+1/(2\pi)) \approx 1.6392 \;;\;
		  b = \sqrt(2)/\pi \approx 0.45		\\
  S_{a2}(z) &amp;=&amp; 2z - z^2					\\
  S_{a3}(z) &amp;=&amp; (1 - (1-z)^2)(a - b(1-z))	\hspace{20}
		&amp; a = 1.008 \;;\; b = 0.208			\\
  S_{a4}(z) &amp;=&amp; x - 0.166 x^3 + 0.00759 x^5 &amp; \approx
	1.5708z - 0.6434z^3 +0.0726 z^5			\\
  S_{a5}(z) &amp;=&amp; az - bz^2					\hspace{20} 
		&amp; a = 1.5551 \;;\; b = 0.5598		\\
\end{eqnarray}
[/tex][/eq]

&lt;p&gt;
The first thing to remember when analyzing mathematical expressions is to disregard the numbers. The actual numbers don&#039;t really matter. You can always move and scale the window you&#039;re working on to a simpler interval, like between 0 and 1. Not only do 0 and 1 often cancel in expressions, but have the benefit of not being approximations. What really matters are the &lt;i&gt;order&lt;/i&gt; of the expressions and the &lt;i&gt;operations&lt;/i&gt;; read through the numbers until it&#039;s time for the final implementation.
&lt;/p&gt;[br]
&lt;p&gt;
&lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a1&lt;/sub&gt;, &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a2&lt;/sub&gt; and &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a3&lt;/sub&gt; are all parabola with different coefficients. Notice how much smaller and easier to read &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a1&lt;/sub&gt; is compared to the original of comment #9. I actually messed up the earlier rewrite because the original form is so awkward with all theparentheses and divisions. Always try to simplify the expressions before you post them. I also managed to figure out that the coefficients of &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a1&lt;/sub&gt; actually involve &#960; and &#8730;2, something that was very non-obvious from the original expression. I&#039;d very much like to know where these came from.
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a2&lt;/sub&gt; is actually the same as &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;2&lt;/sub&gt; from eq[ ]1, only written in terms of &lt;i&gt;z&lt;/i&gt; instead of &lt;i&gt;x&lt;/i&gt;. This was essentially the first of the exercises. The coefficients from &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a3&lt;/sub&gt; seem of come out of thin air, and do not seem to work as well as the other parabola (more on that later).
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a3&lt;/sub&gt; is &#8230; interesting, but in the end it&#039;s just another third order polynomial, much like &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;3&lt;/sub&gt;. The thing is that &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a1&lt;/sub&gt; is more complicated and not as accurate as &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;3&lt;/sub&gt;, and doesn&#039;t even properly match up at the &lt;i&gt;z&lt;/i&gt;[=]1 boundary. By the way, the reason I used (1&#8722;&lt;i&gt;z&lt;/i&gt;) terms in the equation is because it&#039;s actually more of a cosine approximation than one for sines. To turn in into a cosine, change the (1&#8722;&lt;i&gt;z&lt;/i&gt;) into a simple &lt;i&gt;z&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a4&lt;/sub&gt; is a basic fifth order polynomial, like discussed in section 2.1, and it in fact more accurate than &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;5&lt;/sub&gt; and even &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;5o&lt;/sub&gt;. However, no mention was made on where the coefficients came from and in fact there are more accurate coefficients. For example, using the Solver to minimize the RMSD under the condition &lt;i&gt;S&lt;/i&gt;(&lt;i&gt;z&lt;/i&gt;=1)[=]1 gives (a,b,c) &#8776; (1.57033, 0.64209, 0.07176), for an RMDS of 58e-6, whereas the coefficients of &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a4&lt;/sub&gt; result in RMSD=88e-6.You can also use something called [wiki]Chebyshev polynomials[/wiki], which may look kinda funky but includes a method for finding very good coefficients.
&lt;/p&gt;
&lt;p&gt;
Using a different set of conditions or miniziming for some other target error will give different sets of coefficients, all of which will be &#039;best&#039; for those conditions. And this is something you will have to remember: there is no single &#039;best&#039; approximation or set of coefficients ; the &#039;best&#039; depends on what criteria you use. Not specifying your conditions means other people won&#039;t know where your coefficients come from. Since their uses may differ from yours, this can lead them up a blind alley.
&lt;/p&gt;[br]

&lt;p&gt;
That covers the forms of the expressions, now for the error analysis. You mentioned &#039;degree spacing&#039;, but I&#039;m not really sure what that means. If you&#039;re talking about that if you evaluate the approximation at some point &lt;i&gt;x&lt;/i&gt;, the position of its &#039;real&#039; value can be found at, say,&#124;&#916;&lt;i&gt;x&lt;/i&gt;&#124; &lt; 0.01&#176;, that&#039;s not what I&#039;m seeing. But even if that&#039;s not what you mean, a more useful error measurement is in the &lt;i&gt;y&lt;/i&gt;-direction: &#949;[=]approx &#8722; real sine. That you can analyse for the items from Table[ ]2, 3 and 4: the minimum, maximum and average error, and the average squared-distance, RMSD.
&lt;/p&gt;
&lt;p&gt;
What you should &lt;i&gt;not&lt;/i&gt; do is plot a circle and see if it looks circlish. This is problematic for several reasons. First, above some radius you will get gaps because you will use less angle-iterations then there are pixels for the circumference. This is unavoidable. You&#039;d want something that is sure to cover everything, like Bresenham&#039;s [wiki]Midpoint circle algorithm[/wiki]. Second, just plotting the points from the approximation means that you have nothing to compare it to, so you couldn&#039;t tell what is correct and what isn&#039;t. Added to that is the fact that you&#039;re limited to the size of the pixels: With a radius of 100, you can visualise 1% accuracy at best.
&lt;/p&gt;
&lt;p&gt;
Below is a table of relative error statistics, comparable to Table[ ]4. I should probably point out that, even though it&#039;s a parabolic approximation, &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;a1&lt;/sub&gt; gives good results because use the sine-approx for the first octant and &#8730;(1-s&#178;) for the second. Splitting it into sine and cosine parts for the first quadrant is a really neat idea, though I&#039;m not sure if it&#039;s ultimately better than simply using a higher-order approximation.
&lt;/p&gt;

&lt;div class=lblock&gt;
&lt;table border=1 cellpadding=2 cellspacing=0&gt;
&lt;tr&gt; &lt;td&gt;&lt;/td&gt; &lt;th&gt;min (%)&lt;/th&gt; &lt;th&gt;max (%)&lt;/th&gt; &lt;th&gt;max (%)&lt;/th&gt; &lt;th&gt;rmds (%)&lt;/th&gt;  &lt;/tr&gt;
&lt;tr&gt; &lt;th&gt;albS1&lt;/th&gt; &lt;td&gt;-0.417&lt;/td&gt; &lt;td&gt;0.0113&lt;/td&gt; &lt;td&gt;0.299&lt;/td&gt; &lt;td&gt;0.216&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt; &lt;th&gt;albS2&lt;/th&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;3.005&lt;/td&gt; &lt;td&gt;5.601&lt;/td&gt; &lt;td&gt;3.584&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt; &lt;th&gt;albS3&lt;/th&gt; &lt;td&gt;-3.226&lt;/td&gt; &lt;td&gt;-1.664&lt;/td&gt; &lt;td&gt;0.719&lt;/td&gt; &lt;td&gt;2.0523&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt; &lt;th&gt;albS4&lt;/th&gt; &lt;td&gt;-0.014&lt;/td&gt; &lt;td&gt;0.003&lt;/td&gt; &lt;td&gt;0.0014&lt;/td&gt; &lt;td&gt;0.0088&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt; &lt;th&gt;albC4&lt;/th&gt; &lt;td&gt;-0.089&lt;/td&gt; &lt;td&gt;0.020&lt;/td&gt; &lt;td&gt;0.095&lt;/td&gt; &lt;td&gt;0.062&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt; &lt;th&gt;albS5&lt;/th&gt; &lt;td&gt;-7.84&lt;/td&gt; &lt;td&gt;-4.568&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;5.265&lt;/td&gt;  &lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;
If you&#039;re still looking for suitable approximations, keep these points in mind.
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;
    &lt;b&gt;Keep the expressions simple!&lt;/b&gt; The correctness of an     approximation is mostly determined by the order of the polynomial.     No matter how clunky you make an expression, it makes no difference if,     at the end of the day, it amounts to a simple parabola. Those are     gonna suck no matter what (relative to higher-order, I mean).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;p&gt;
    Stay away from raw numbers as much as possible. Raw numbers do not 	translate well to other situations (see the Gimli glider incident 	linked in the article), and will almost always only be approximations.		Either use &#039;natural&#039; dimensionless units like radians or scale the 	situation to a [0,[ ]1] domain or range. &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;p&gt;
    Before you do anything, decide what &#039;sufficiently good&#039; means for 	your situation. Consider things like accuracy at the boundaries, 	smoothness of the function, calculation time and min/max/overall 	errors. When showing your work to others, include how you got 	to your conclusions. Graphs also help, though I understand that&#039;s 	a little hard to put in a comment.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;p&gt;
    Above all, make sure it&#039;s actually an improvement over what is 	already available. The idea to divide into octants instead of 	quadrants is a great idea, but most of the actual approximations 	you provided was either the equal or worse than what was already 
	presented.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
If you&#039;re interested, I&#039;ve uploaded the Excel file I used for the analysis &lt;a href=&quot;http://www.coranac.com/files/misc/sine-aprx.zip&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;. I&#039;ve condensed it for size, but the essentials are there. The main sheet contains a sizable amount of approximations and their errors. The extra sheet shows an example of how you can calculate coefficients from a set of conditions, in this case for eq[ ]24 and comment #6.
&lt;/p&gt;</description>
		<content:encoded><![CDATA[<p>
 * <i>dons Professor cap.</i>
 </p>
<div>&nbsp;</div>
<p>
 Albert, I appreciate what you&#8217;re trying to do here, but your approach to the subject could use some work. Your expressions are way too complicated, and using more or less random angular units. This makes it very hard to see what they actually say. Also, you&#8217;re not stating the reasons behind the coefficients, nor doing proper error analysis; with the exception of Richard&#8217;s, the expressions are worse than the ones in the article.
 </p>
<p>
 First, here are the expressions again, but compressed to their essentials. I will use the coordinate transformation <i>z</i>[=]<i>x</i>/(&frac12;&pi;), because having the boundaries at 0.0 and 1.0 makes things much easier to analyse. Note how much smaller they are.
 </p>
<table class="eqtbl">
<tr>
<td class="eqnrcell"></td>
<td class="eqcell"> <img src='http://www.coranac.com/cgi-bin/mimetex.cgi?%5Cbegin%7Beqnarray%7D%20S_%7Ba1%7D%28z%29%20%26%3D%26%20az%20-%20bz%5E2%20%5Chspace%7B20%7D%20%26%20a%20%3D%20%5Csqrt%7B2%7D%281%2B1%2F%282%5Cpi%29%29%20%5Capprox%201.6392%20%5C%3B%3B%5C%3B%20b%20%3D%20%5Csqrt%282%29%2F%5Cpi%20%5Capprox%200.45%20%5C%5C%20S_%7Ba2%7D%28z%29%20%26%3D%26%202z%20-%20z%5E2%20%5C%5C%20S_%7Ba3%7D%28z%29%20%26%3D%26%20%281%20-%20%281-z%29%5E2%29%28a%20-%20b%281-z%29%29%20%5Chspace%7B20%7D%20%26%20a%20%3D%201.008%20%5C%3B%3B%5C%3B%20b%20%3D%200.208%20%5C%5C%20S_%7Ba4%7D%28z%29%20%26%3D%26%20x%20-%200.166%20x%5E3%20%2B%200.00759%20x%5E5%20%26%20%5Capprox%201.5708z%20-%200.6434z%5E3%20%2B0.0726%20z%5E5%20%5C%5C%20S_%7Ba5%7D%28z%29%20%26%3D%26%20az%20-%20bz%5E2%20%5Chspace%7B20%7D%20%26%20a%20%3D%201.5551%20%5C%3B%3B%5C%3B%20b%20%3D%200.5598%20%5C%5C%20%5Cend%7Beqnarray%7D' 	title="\begin{eqnarray} S_{a1}(z) &amp;=&amp; az - bz^2 \hspace{20} &amp; a = \sqrt{2}(1+1/(2\pi)) \approx 1.6392 \;;\; b = \sqrt(2)/\pi \approx 0.45 \\ S_{a2}(z) &amp;=&amp; 2z - z^2 \\ S_{a3}(z) &amp;=&amp; (1 - (1-z)^2)(a - b(1-z)) \hspace{20} &amp; a = 1.008 \;;\; b = 0.208 \\ S_{a4}(z) &amp;=&amp; x - 0.166 x^3 + 0.00759 x^5 &amp; \approx 1.5708z - 0.6434z^3 +0.0726 z^5 \\ S_{a5}(z) &amp;=&amp; az - bz^2 \hspace{20} &amp; a = 1.5551 \;;\; b = 0.5598 \\ \end{eqnarray}" 	alt="\begin{eqnarray} S_{a1}(z) &amp;=&amp; az - bz^2 \hspace{20} &amp; a = \sqrt{2}(1+1/(2\pi)) \approx 1.6392 \;;\; b = \sqrt(2)/\pi \approx 0.45 \\ S_{a2}(z) &amp;=&amp; 2z - z^2 \\ S_{a3}(z) &amp;=&amp; (1 - (1-z)^2)(a - b(1-z)) \hspace{20} &amp; a = 1.008 \;;\; b = 0.208 \\ S_{a4}(z) &amp;=&amp; x - 0.166 x^3 + 0.00759 x^5 &amp; \approx 1.5708z - 0.6434z^3 +0.0726 z^5 \\ S_{a5}(z) &amp;=&amp; az - bz^2 \hspace{20} &amp; a = 1.5551 \;;\; b = 0.5598 \\ \end{eqnarray}" /> </td>
</tr>
</table>
<p>
 The first thing to remember when analyzing mathematical expressions is to disregard the numbers. The actual numbers don&#8217;t really matter. You can always move and scale the window you&#8217;re working on to a simpler interval, like between 0 and 1. Not only do 0 and 1 often cancel in expressions, but have the benefit of not being approximations. What really matters are the <i>order</i> of the expressions and the <i>operations</i>; read through the numbers until it&#8217;s time for the final implementation.
 </p>
<div>&nbsp;</div>
<p>
 <i>S</i><sub>a1</sub>, <i>S</i><sub>a2</sub> and <i>S</i><sub>a3</sub> are all parabola with different coefficients. Notice how much smaller and easier to read <i>S</i><sub>a1</sub> is compared to the original of comment #9. I actually messed up the earlier rewrite because the original form is so awkward with all theparentheses and divisions. Always try to simplify the expressions before you post them. I also managed to figure out that the coefficients of <i>S</i><sub>a1</sub> actually involve &pi; and &radic;2, something that was very non-obvious from the original expression. I&#8217;d very much like to know where these came from.
 </p>
<p>
 <i>S</i><sub>a2</sub> is actually the same as <i>S</i><sub>2</sub> from eq&nbsp;1, only written in terms of <i>z</i> instead of <i>x</i>. This was essentially the first of the exercises. The coefficients from <i>S</i><sub>a3</sub> seem of come out of thin air, and do not seem to work as well as the other parabola (more on that later).
 </p>
<p>
 <i>S</i><sub>a3</sub> is &hellip; interesting, but in the end it&#8217;s just another third order polynomial, much like <i>S</i><sub>3</sub>. The thing is that <i>S</i><sub>a1</sub> is more complicated and not as accurate as <i>S</i><sub>3</sub>, and doesn&#8217;t even properly match up at the <i>z</i>[=]1 boundary. By the way, the reason I used (1&minus;<i>z</i>) terms in the equation is because it&#8217;s actually more of a cosine approximation than one for sines. To turn in into a cosine, change the (1&minus;<i>z</i>) into a simple <i>z</i>.
 </p>
<p>
 <i>S</i><sub>a4</sub> is a basic fifth order polynomial, like discussed in section 2.1, and it in fact more accurate than <i>S</i><sub>5</sub> and even <i>S</i><sub>5o</sub>. However, no mention was made on where the coefficients came from and in fact there are more accurate coefficients. For example, using the Solver to minimize the RMSD under the condition <i>S</i>(<i>z</i>=1)[=]1 gives (a,b,c) &asymp; (1.57033, 0.64209, 0.07176), for an RMDS of 58e-6, whereas the coefficients of <i>S</i><sub>a4</sub> result in RMSD=88e-6.You can also use something called<br />
<a href="http://en.wikipedia.org/wiki/Chebyshev%20polynomials">Chebyshev polynomials</a>, which may look kinda funky but includes a method for finding very good coefficients.
 </p>
<p>
 Using a different set of conditions or miniziming for some other target error will give different sets of coefficients, all of which will be &#8216;best&#8217; for those conditions. And this is something you will have to remember: there is no single &#8216;best&#8217; approximation or set of coefficients ; the &#8216;best&#8217; depends on what criteria you use. Not specifying your conditions means other people won&#8217;t know where your coefficients come from. Since their uses may differ from yours, this can lead them up a blind alley.
 </p>
<div>&nbsp;</div>
<p>
 That covers the forms of the expressions, now for the error analysis. You mentioned &#8216;degree spacing&#8217;, but I&#8217;m not really sure what that means. If you&#8217;re talking about that if you evaluate the approximation at some point <i>x</i>, the position of its &#8216;real&#8217; value can be found at, say,|&Delta;<i>x</i>| &lt; 0.01&deg;, that&#8217;s not what I&#8217;m seeing. But even if that&#8217;s not what you mean, a more useful error measurement is in the <i>y</i>-direction: &epsilon;[=]approx &minus; real sine. That you can analyse for the items from Table&nbsp;2, 3 and 4: the minimum, maximum and average error, and the average squared-distance, RMSD.
 </p>
<p>
 What you should <i>not</i> do is plot a circle and see if it looks circlish. This is problematic for several reasons. First, above some radius you will get gaps because you will use less angle-iterations then there are pixels for the circumference. This is unavoidable. You&#8217;d want something that is sure to cover everything, like Bresenham&#8217;s<br />
<a href="http://en.wikipedia.org/wiki/Midpoint%20circle%20algorithm">Midpoint circle algorithm</a>. Second, just plotting the points from the approximation means that you have nothing to compare it to, so you couldn&#8217;t tell what is correct and what isn&#8217;t. Added to that is the fact that you&#8217;re limited to the size of the pixels: With a radius of 100, you can visualise 1% accuracy at best.
 </p>
<p>
 Below is a table of relative error statistics, comparable to Table&nbsp;4. I should probably point out that, even though it&#8217;s a parabolic approximation, <i>S</i><sub>a1</sub> gives good results because use the sine-approx for the first octant and &radic;(1-s&sup2;) for the second. Splitting it into sine and cosine parts for the first quadrant is a really neat idea, though I&#8217;m not sure if it&#8217;s ultimately better than simply using a higher-order approximation.
 </p>
<div class=lblock>
<table border=1 cellpadding=2 cellspacing=0>
<tr>
<td></td>
<th>min (%)</th>
<th>max (%)</th>
<th>max (%)</th>
<th>rmds (%)</th>
</tr>
<tr>
<th>albS1</th>
<td>-0.417</td>
<td>0.0113</td>
<td>0.299</td>
<td>0.216</td>
</tr>
<tr>
<th>albS2</th>
<td>0</td>
<td>3.005</td>
<td>5.601</td>
<td>3.584</td>
</tr>
<tr>
<th>albS3</th>
<td>-3.226</td>
<td>-1.664</td>
<td>0.719</td>
<td>2.0523</td>
</tr>
<tr>
<th>albS4</th>
<td>-0.014</td>
<td>0.003</td>
<td>0.0014</td>
<td>0.0088</td>
</tr>
<tr>
<th>albC4</th>
<td>-0.089</td>
<td>0.020</td>
<td>0.095</td>
<td>0.062</td>
</tr>
<tr>
<th>albS5</th>
<td>-7.84</td>
<td>-4.568</td>
<td>0</td>
<td>5.265</td>
</tr>
</table></div>
<p>
 If you&#8217;re still looking for suitable approximations, keep these points in mind.
 </p>
<ul>
<li>
<p>
     <b>Keep the expressions simple!</b> The correctness of an     approximation is mostly determined by the order of the polynomial.     No matter how clunky you make an expression, it makes no difference if,     at the end of the day, it amounts to a simple parabola. Those are     gonna suck no matter what (relative to higher-order, I mean).</p>
</li>
<li>
<p>
     Stay away from raw numbers as much as possible. Raw numbers do not 	translate well to other situations (see the Gimli glider incident 	linked in the article), and will almost always only be approximations.		Either use &#8216;natural&#8217; dimensionless units like radians or scale the 	situation to a [0,&nbsp;1] domain or range. </p>
</li>
<li>
<p>
     Before you do anything, decide what &#8217;sufficiently good&#8217; means for 	your situation. Consider things like accuracy at the boundaries, 	smoothness of the function, calculation time and min/max/overall 	errors. When showing your work to others, include how you got 	to your conclusions. Graphs also help, though I understand that&#8217;s 	a little hard to put in a comment.</p>
</li>
<li>
<p>
     Above all, make sure it&#8217;s actually an improvement over what is 	already available. The idea to divide into octants instead of 	quadrants is a great idea, but most of the actual approximations 	you provided was either the equal or worse than what was already<br />
 	presented.</p>
</li>
</ul>
<p>
 If you&#8217;re interested, I&#8217;ve uploaded the Excel file I used for the analysis <a href="http://www.coranac.com/files/misc/sine-aprx.zip" rel="nofollow">here</a>. I&#8217;ve condensed it for size, but the essentials are there. The main sheet contains a sizable amount of approximations and their errors. The extra sheet shows an example of how you can calculate coefficients from a set of conditions, in this case for eq&nbsp;24 and comment #6.
 </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Albert Redditt</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2579</link>
		<dc:creator>Albert Redditt</dc:creator>
		<pubDate>Sun, 08 Nov 2009 01:06:25 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2579</guid>
		<description>&#039;Albert&#039;s newest formula for a 200 degree pi
&#039;the degrees, there are 100 in a quad
&#039; its actually a chord calculator but the chord of a particular degree is the sine of half that degree.
&#039; the degrees are off a little (few hundredths) and the circle is a little flat on top and sides.

dim as double sarc,carc,sgrad2,cgrad2
dim as double deg = atn(1)/100
For grad = 0 To 100 Step 10
    
    sgrad2 = grad * 2
    cgrad2 = 200 - (grad*2)
    
    sarc = deg * (grad*2)
    carc = deg * (200-(grad*2))
    
    s = sarc * ((100- ((sgrad2 * .0009)*sgrad2)) / 100) *.99
    c = carc * ((100- ((cgrad2 * .0009)*cgrad2)) / 100) *.99
        
    x = radius * c
    y = radius * s
    
    Pset (xctr + x, yctr - y), 9
Next</description>
		<content:encoded><![CDATA[<p>&#8216;Albert&#8217;s newest formula for a 200 degree pi<br />
 &#8216;the degrees, there are 100 in a quad<br />
 &#8216; its actually a chord calculator but the chord of a particular degree is the sine of half that degree.<br />
 &#8216; the degrees are off a little (few hundredths) and the circle is a little flat on top and sides.</p>
<p> dim as double sarc,carc,sgrad2,cgrad2<br />
 dim as double deg = atn(1)/100<br />
 For grad = 0 To 100 Step 10</p>
<p>     sgrad2 = grad * 2<br />
     cgrad2 = 200 &#8211; (grad*2)</p>
<p>     sarc = deg * (grad*2)<br />
     carc = deg * (200-(grad*2))</p>
<p>     s = sarc * ((100- ((sgrad2 * .0009)*sgrad2)) / 100) *.99<br />
     c = carc * ((100- ((cgrad2 * .0009)*cgrad2)) / 100) *.99</p>
<p>     x = radius * c<br />
     y = radius * s</p>
<p>     Pset (xctr + x, yctr &#8211; y), 9<br />
 Next</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Albert Redditt</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2578</link>
		<dc:creator>Albert Redditt</dc:creator>
		<pubDate>Sat, 07 Nov 2009 18:18:58 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2578</guid>
		<description>A guy named Richard,from the FreeBasic forum gave me this formula.
It has almost perfect degree spacing.(off by a few hundredths.)

&#039; Richards version using radians
Const As Double Pion2 = 2 * Atn(1)
For t = 0 To Pion2 Step pion2/100  &#039;&#039;&#039;&#039;&#039;divided pion2 by required degrees.
    tt = t * t
    s = t * ( 1 + tt * ( -0.166 + tt * 7.589986441271250e-3))  &#039; odd function
    c =     ( 1 + tt * ( -0.496 + tt * 3.676551227144884e-2))  &#039; even function

    x = radius * c
    y = radius * s
    Pset (xctr + x, yctr - y), 13
    Pset (xctr + x, yctr + y), 13
    Pset (xctr - x, yctr - y), 13
    Pset (xctr - x, yctr + y), 13
Next t</description>
		<content:encoded><![CDATA[<p>A guy named Richard,from the FreeBasic forum gave me this formula.<br />
 It has almost perfect degree spacing.(off by a few hundredths.)</p>
<p> &#8216; Richards version using radians<br />
 Const As Double Pion2 = 2 * Atn(1)<br />
 For t = 0 To Pion2 Step pion2/100  &#8221;&#8221;&#8217;divided pion2 by required degrees.<br />
     tt = t * t<br />
     s = t * ( 1 + tt * ( -0.166 + tt * 7.589986441271250e-3))  &#8216; odd function<br />
     c =     ( 1 + tt * ( -0.496 + tt * 3.676551227144884e-2))  &#8216; even function</p>
<p>     x = radius * c<br />
     y = radius * s<br />
     Pset (xctr + x, yctr &#8211; y), 13<br />
     Pset (xctr + x, yctr + y), 13<br />
     Pset (xctr &#8211; x, yctr &#8211; y), 13<br />
     Pset (xctr &#8211; x, yctr + y), 13<br />
 Next t</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Albert Redditt</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2570</link>
		<dc:creator>Albert Redditt</dc:creator>
		<pubDate>Thu, 05 Nov 2009 16:26:36 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2570</guid>
		<description>&#039;&#039; Albert&#039;s attempt at a 400 degree circle
&#039;&#039; written in Freebasic for windows from:
&#039;&#039; http://www.freebasic.net


dim as double deg,sine,cosine
dim as double xctr,yctr,radius,x,y,holdx

screen 19

xctr = 305
yctr = 305
radius = 300

circle(xctr,yctr),radius+1,9
x = radius
y = 0
for deg = 0 to 100 step .5
    
        sine = (10000 - ((100-deg) * (100-deg))) *.0001 *(.8 + (.00208*deg))
        cosine = (10000 - (deg*deg)) *.0001 *(.999 - (.0005*deg))
        holdx = x
        x = radius * cosine
        y = radius * sine
        
        line(xctr,yctr)-(xctr+  x,yctr+ -y),14
        line(xctr,yctr)-(xctr+  x,yctr+  y),14
        line(xctr,yctr)-(xctr+ -x,yctr+-y),14
        line(xctr,yctr)-(xctr+ -x,yctr+ y),14
        
next

sleep</description>
		<content:encoded><![CDATA[<p>&#8221; Albert&#8217;s attempt at a 400 degree circle<br />
 &#8221; written in Freebasic for windows from:<br />
 &#8221; <a href="http://www.freebasic.net" rel="nofollow">http://www.freebasic.net</a></p>
<p> dim as double deg,sine,cosine<br />
 dim as double xctr,yctr,radius,x,y,holdx</p>
<p> screen 19</p>
<p> xctr = 305<br />
 yctr = 305<br />
 radius = 300</p>
<p> circle(xctr,yctr),radius+1,9<br />
 x = radius<br />
 y = 0<br />
 for deg = 0 to 100 step .5</p>
<p>         sine = (10000 &#8211; ((100-deg) * (100-deg))) *.0001 *(.8 + (.00208*deg))<br />
         cosine = (10000 &#8211; (deg*deg)) *.0001 *(.999 &#8211; (.0005*deg))<br />
         holdx = x<br />
         x = radius * cosine<br />
         y = radius * sine</p>
<p>         line(xctr,yctr)-(xctr+  x,yctr+ -y),14<br />
         line(xctr,yctr)-(xctr+  x,yctr+  y),14<br />
         line(xctr,yctr)-(xctr+ -x,yctr+-y),14<br />
         line(xctr,yctr)-(xctr+ -x,yctr+ y),14</p>
<p> next</p>
<p> sleep</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cearn</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2536</link>
		<dc:creator>cearn</dc:creator>
		<pubDate>Tue, 20 Oct 2009 19:33:40 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2536</guid>
		<description>&lt;p&gt;
Albert, a simpler way to write that approximation would be:
&lt;/p&gt;

[tex]
sin(\small\frac12\normalsize\pi x) = x\sqrt{x} + \sqrt{2} x (1-x)
[/tex]

&lt;p&gt;
I&#039;ve tested it and it does work well. It&#039;s about twice as accurate as the third-order approximation, &lt;i&gt;S&lt;/i&gt;&lt;sub&gt;3&lt;/sub&gt;(x). However, there are two problems with it.
&lt;/p&gt;
&lt;p&gt;
First, it uses a square root, which is not a simple operation. If it&#039;s not in the instruction set of the processor you&#039;re working with, it will probably cost at least as much as calculating a sine.
&lt;/p&gt;
&lt;p&gt;
Second, even if you have a fast square root and assuming it&#039;s as fast as a multiplication (which is a big assumption), you&#039;d have to spend 4 MULs worth of cycles. Since the fifth order function also uses 4 multiplications and is &lt;i&gt;considerably&lt;/i&gt; more accurate, you&#039;d be better off using that.
&lt;/p&gt;</description>
		<content:encoded><![CDATA[<p>
 Albert, a simpler way to write that approximation would be:
 </p>
<p>  <img src='http://www.coranac.com/cgi-bin/mimetex.cgi?sin%28%5Csmall%5Cfrac12%5Cnormalsize%5Cpi%20x%29%20%3D%20x%5Csqrt%7Bx%7D%20%2B%20%5Csqrt%7B2%7D%20x%20%281-x%29' 	title="sin(\small\frac12\normalsize\pi x) = x\sqrt{x} + \sqrt{2} x (1-x)" 	alt="sin(\small\frac12\normalsize\pi x) = x\sqrt{x} + \sqrt{2} x (1-x)" /> </p>
<p>
 I&#8217;ve tested it and it does work well. It&#8217;s about twice as accurate as the third-order approximation, <i>S</i><sub>3</sub>(x). However, there are two problems with it.
 </p>
<p>
 First, it uses a square root, which is not a simple operation. If it&#8217;s not in the instruction set of the processor you&#8217;re working with, it will probably cost at least as much as calculating a sine.
 </p>
<p>
 Second, even if you have a fast square root and assuming it&#8217;s as fast as a multiplication (which is a big assumption), you&#8217;d have to spend 4 MULs worth of cycles. Since the fifth order function also uses 4 multiplications and is <i>considerably</i> more accurate, you&#8217;d be better off using that.
 </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Albert Redditt</title>
		<link>http://www.coranac.com/2009/07/sines/comment-page-1/#comment-2527</link>
		<dc:creator>Albert Redditt</dc:creator>
		<pubDate>Sat, 17 Oct 2009 04:44:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.coranac.com/?p=87#comment-2527</guid>
		<description>On the above post the cosine can be stated as :

cosine = sqr(1- sine * sine)

here is an arc formula that i believe plots a parabola. if i&#039;m not mistaken.

    y = (180-deg)*(deg/180) * .0222

it deviates from a true sine curve on the sides by about 5 degrees wider than the sine curve.</description>
		<content:encoded><![CDATA[<p>On the above post the cosine can be stated as :</p>
<p> cosine = sqr(1- sine * sine)</p>
<p> here is an arc formula that i believe plots a parabola. if i&#8217;m not mistaken.</p>
<p>     y = (180-deg)*(deg/180) * .0222</p>
<p> it deviates from a true sine curve on the sides by about 5 degrees wider than the sine curve.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

<!--
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
</head>
<body>
<p>
My database has called in sick. Please imagine some 
annoying elevator tune till he gets back.
</p>
<p>
<small>[[Doo-di-doo tooo. Dum-di-dum-di-doo-dooo.]]</small>
</p>
</body>
</html>

-->