Help Needed for gcc on Linux x86_64

Andrew Haley aph@redhat.com
Thu May 18 13:25:00 GMT 2006


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.



More information about the Gcc-help mailing list