2012-02-12 20 views
12

Tengo un problema con la función "sin" de libc.g ++ opciones de optimización afectan el valor de la función sin

#include <cmath> 
#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    double tt = 6.28318530717958620000; // 2 * M_PI 
    double yy = ::sin(tt); 

    printf("%.32f\n", yy); 

    return 0; 
} 

Al compilar el código anterior utilizando "g ++" sin ninguna opción de optimización, lo haría de salida "-0,00000000000000024492127076447545". Pero si con la opción "-O3", mostraría "-0.00000000000000024492935982947064".

¿Por qué no devuelve "-0.00000000000000024492935982947064" sin "-O3"? Gracias de antemano.

+0

¿Puedo saber qué versión de g ++ y qué sistema operativo y hardware está utilizando? – Viet

+0

g ++ 4.4.3, ubuntu 10.04, e Intel (R) Core (TM) i3-2310M CPU a 2.10 GHz. GRACIAS. –

+0

Eche un vistazo a la opción '-ffast-math' tal vez. –

Respuesta

6

Porque con "-O3" el compilador calcula previamente sin(2*pi) en tiempo de compilación, con un algoritmo. Sin "-O3" esto se calcula en tiempo de ejecución, con otro algoritmo.

Esto puede deberse a que el compilador en sí se creó con alguna biblioteca matemática, que difiere de su biblioteca matemática.

actualización

La única entidad, dando el resultado "-0,00000000000000024492127076447545" es la versión de 32 bits de libstdC++. La versión de 64 bits de la misma biblioteca y el mismo gcc producen "-0.00000000000000024492935982947064".

Por lo tanto, la actualización a una versión más nueva no ayudará. También probé varias opciones, propuestas aquí: ni -ffloat-store, ni -fno-builtin no hacen ninguna diferencia, así como long double y sinl.

32-bit libstdC++ usa 387 instrucciones de coma flotante, mientras que gcc aparentemente usa instrucciones de SSE. Aquí está la diferencia. Probablemente, la única forma de hacer que sean coherentes es reconstruir gcc a partir de las fuentes, orientándolas a usar solo 387 instrucciones internamente.

+0

Gracias por su respuesta. ¿Sabes si es posible obtener "-0.00000000000000024492935982947064" en tiempo de ejecución? ¿Y cómo? –

+1

@Sanders '-fno-builtin' para asegurarse de que no se utiliza ninguna función integrada, por lo general ayuda a evitar que el resultado se compute en tiempo de compilación. Pero aún así, el resultado que obtiene no es normal, probablemente haya un error en el compilador o en la biblioteca. Deberías intentar actualizar a una nueva versión. – ouah

+0

@ouah OK, actualizaré mi versión de g ++ y lo intentaré. GRACIAS. –

Cuestiones relacionadas