> > 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;
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