Ashwani Bhat writes: > On Linux 64 bit platform, gcc shows poor performance for pow() function > when the first argument is very close to 1. To reproduce the issue, just > create a simple c file case.c > > Contents of case.c > ================== > #include <stdio.h> > #include <math.h> > > int main(){ > double x; > int i; > for( i=1; i<10000; i++ ) { > x = pow( 1.0000000000000002, 1.5 ); > } > printf( "x = %1.30f\n", x ); > } > > then compile it > % gcc -lm -m64 case.c -o case > % ./case > > Notes > 1. gcc option -ffast-math does not help here > 2. if compiled with "-m32" instead of "-m64", then the calculation is > fast. > > Can you please help me here .. I have tried it with gcc -v3.2.3, 3.4.2, > 4.1.0. But results are same. Interesting. The case you have found is one where on the x86_64 libm calls a special routine (amusingly? called __slowpow) which does the whole calculation using multi-precision doubles. This routine is only called in the rare case where the standard routines aren't accurate enough to obtain a correctly rounded result. In the x87 case, there is a special assembly-langauge version of __ieee754_pow. This takes advantage of the extended precision in the x87, so it doesn't need to call __slowpow. Andrew.