#include #include #include #include #if 0 #define FLT float #define FLTINT uint32_t #define SIN(x) sinf(x) #define EPS FLT_EPSILON #else #define FLT double #define FLTINT uint64_t #define SIN(x) sin(x) #define EPS DBL_EPSILON #endif int main(int argc, char **argv) { FLT angle, sine; FLTINT factor, inc; int signum, steps; angle= 0; factor= 0; while( 13 ) { if( angle > M_PI/EPS ) break; sine= SIN(angle); if( sine == 0.0 ) printf("%.17g\t\t0x%016llX\n", (double)angle, (uint64_t)*(FLTINT*)&angle); else { signum= sine > 0 ? 1 : -1; /* Go in the direction of the sign change of sin: */ if( factor & 1 ) inc= signum; else inc= -signum; steps= 0; while( 13 ) { *(FLTINT*)&angle += inc; sine= SIN(angle); if( sine == 0.0 ) printf("%.17g\t\t0x%016llX\n", angle, *(uint64_t*)&angle); else if( signum > 0 ? sine < 0 : sine > 0 ) break; ++steps; } if( steps > 5 ) printf("%d steps: %g (starting at %g)\n", steps, angle, factor * M_PI); } ++factor; angle += M_PI; } return 0; }