On Sep 26 17:41:17, h...@stare.cz 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 >