On Sep 26 17:41:17, [email protected] wrote:
> > > s_sin.c normalizes the argument to [-pi/4, +pi/4].
> > > This is how |x| <= pi/4 is tested:
> > >
> > > GET_HIGH_WORD(ix,x);
> > > ix &= 0x7fffffff;
> > > if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0);
> > >
> > > Why is it done like that? Is it faster or more portable
> > > or in any way better that comparing the value itself to M_PI_4?
> > > (Or was it, in 1993?)
> >
> > Hm, is 0x3fe921fb the nearest float <= pi/4?
> > s_sinf.c uses 0x3f490fd8 for that test.
>
> Yes.
>
> #include <stdio.h>
> #include <math.h>
> #include "math_private.h"
>
> int
> main()
> {
> double d = M_PI_4;
> double f = M_PI_4;
float f, sorry.
> int32_t i, j;
>
> GET_HIGH_WORD(i, d);
> GET_FLOAT_WORD(j, f);
>
> printf("double %f, high word %#x\n", d, i);
> printf("float %f, float word %#x\n", f, j);
>
> return 0;
> }
>
> This says
>
> double 0.785398, high word 0x3fe921fb
> float 0.785398, float word 0x3f490fdb
>
> In case of double, it's exactly 0x3fe921fb.
> But why then does s_sinf.c use 0x3f490fd8 instead of 0x3f490fdb?
>
> Jan
>