
<font color="#0000ff">/*</font><font color="#0000ff">  sincosf.c: Computes sin or cos of a 32-bit float as outlined in [1]</font>

<font color="#0000ff">    Copyright (C) 2001, 2002  Jesus Calvino-Fraga, jesusc@ieee.org</font>

<font color="#0000ff">    This library is free software; you can redistribute it and/or</font>
<font color="#0000ff">    modify it under the terms of the GNU Lesser General Public</font>
<font color="#0000ff">    License as published by the Free Software Foundation; either</font>
<font color="#0000ff">    version 2.1 of the License, or (at your option) any later version.</font>

<font color="#0000ff">    This library is distributed in the hope that it will be useful,</font>
<font color="#0000ff">    but WITHOUT ANY WARRANTY; without even the implied warranty of</font>
<font color="#0000ff">    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</font>
<font color="#0000ff">    Lesser General Public License for more details.</font>

<font color="#0000ff">    You should have received a copy of the GNU Lesser General Public</font>
<font color="#0000ff">    License along with this library; if not, write to the Free Software</font>
<font color="#0000ff">    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA */</font>

<font color="#0000ff">/*</font><font color="#0000ff"> [1] William James Cody and W.  M.  Waite.  _Software manual for the</font>
<font color="#0000ff">   elementary functions_, Englewood Cliffs, N.J.:Prentice-Hall, 1980. */</font>

<font color="#0000ff">/*</font><font color="#0000ff"> Version 1.0 - Initial release */</font>

<font color="#a020f0">#include </font><font color="#ff00ff">&lt;math.h&gt;</font>
<font color="#a020f0">#include </font><font color="#ff00ff">&lt;errno.h&gt;</font>
<font color="#a020f0">#include </font><font color="#ff00ff">&lt;stdbool.h&gt;</font>

<font color="#a020f0">#define r1      -</font><font color="#ff00ff">0.1666665668E+0</font>
<font color="#a020f0">#define r2       </font><font color="#ff00ff">0.8333025139E-2</font>
<font color="#a020f0">#define r3      -</font><font color="#ff00ff">0.1980741872E-3</font>
<font color="#a020f0">#define r4       </font><font color="#ff00ff">0.2601903036E-5</font>

<font color="#0000ff">/*</font><font color="#0000ff"> PI=C1+C2 */</font>
<font color="#a020f0">#define C1       </font><font color="#ff00ff">3.140625</font>
<font color="#a020f0">#define C2       </font><font color="#ff00ff">9.676535897E-4</font>

<font color="#0000ff">/*</font><font color="#0000ff">A reasonable value for YMAX is the int part of PI*B**(t/2)=3.1416*2**(12)*/</font>
<font color="#a020f0">#define YMAX     </font><font color="#ff00ff">12867.0</font>

<font color="#2e8b57"><b>float</b></font> sincosf(<font color="#2e8b57"><b>const</b></font> <font color="#2e8b57"><b>float</b></font> x, <font color="#2e8b57"><b>const</b></font> <font color="#2e8b57"><b>int</b></font> iscos)
{
    <font color="#2e8b57"><b>float</b></font> y, f, r, g, XN;
    <font color="#2e8b57"><b>int</b></font> N;
        BOOL sign;

    <font color="#804040"><b>if</b></font>(iscos)
    {
        y=fabsf(x)+HALF_PI;
        sign=<font color="#ff00ff">0</font>;
    }
    <font color="#804040"><b>else</b></font>
    {
        <font color="#804040"><b>if</b></font>(x&lt;<font color="#ff00ff">0.0</font>)
            { y=-x; sign=<font color="#ff00ff">1</font>; }
        <font color="#804040"><b>else</b></font>
            { y=x; sign=<font color="#ff00ff">0</font>; }
    }

    <font color="#804040"><b>if</b></font>(y&gt;YMAX)
    {
        errno=<font color="#ff00ff">ERANGE</font>;
        <font color="#804040"><b>return</b></font> <font color="#ff00ff">0.0</font>;
    }

    <font color="#0000ff">/*</font><font color="#0000ff">Round y/PI to the nearest integer*/</font>
    N=((y*iPI)+<font color="#ff00ff">0.5</font>); <font color="#0000ff">/*</font><font color="#0000ff">y is positive*/</font>

    <font color="#0000ff">/*</font><font color="#0000ff">If N is odd change sign*/</font>
    <font color="#804040"><b>if</b></font>(N&amp;<font color="#ff00ff">1</font>) sign=!sign;

    XN=N;
    <font color="#0000ff">/*</font><font color="#0000ff">Cosine required? (is done here to keep accuracy)*/</font>
    <font color="#804040"><b>if</b></font>(iscos) XN-=<font color="#ff00ff">0.5</font>;

    y=fabsf(x);
    r=(<font color="#2e8b57"><b>int</b></font>)y;
    g=y-r;
    f=((r-XN*C1)+g)-XN*C2;

    g=f*f;
    <font color="#804040"><b>if</b></font>(g&gt;EPS2) <font color="#0000ff">//Used to be if(fabsf(f)&gt;EPS)</font>
    {
        r=(((r4*g+r3)*g+r2)*g+r1)*g;
        f+=f*r;
    }
    <font color="#804040"><b>return</b></font> (sign?-f:f);
}
