This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: Help Needed for gcc on Linux x86_64
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.