2012-02-12 12 views
12

Ho un problema con la funzione "sin" di libc.Le opzioni di ottimizzazione g ++ hanno effetto sul valore della funzione 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; 
} 

Quando compilare il codice di cui sopra con "g ++", senza alcuna opzione di ottimizzazione, sarebbe uscita "-0,00000000000000024492127076447545". Ma se con l'opzione "-O3", emetterebbe "-0,00000000000000024492935982947064".

Perché non restituisce "-0,00000000000000024492935982947064" senza "-O3"? Grazie in anticipo.

+0

Posso sapere quale versione di g ++ e quale sistema operativo e hardware utilizzi? – Viet

+0

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

+0

Controlla l'opzione '-ffast-math', forse. –

risposta

6

Perché con "-O3" il compilatore precompila sin(2*pi) in fase di compilazione, con un algoritmo. Senza "-O3" questo è calcolato in runtime, con un altro algoritmo.

Ciò può essere dovuto al fatto che il compilatore stesso è stato creato con alcune librerie matematiche, che differiscono dalla libreria matematica.

Aggiornamento

L'unica entità, dando il risultato "-0,00000000000000024492127076447545" è la versione a 32 bit di libstdC++. La versione a 64 bit della stessa libreria e di gcc produce "-0,00000000000000024492935982947064".

Quindi l'aggiornamento alla versione più recente non sarà di aiuto. Ho anche provato varie opzioni, proposte qui: né -ffloat-store, né -fno-builtin non fanno alcuna differenza, così come long double e sinl.

libstdC++ a 32 bit utilizza 387 istruzioni in virgola mobile, mentre gcc utilizza apparentemente le istruzioni SSE. Ecco la differenza. Probabilmente, l'unico modo per renderli coerenti è ricostruire gcc dai sorgenti, indirizzandoli a utilizzare internamente solo 387 istruzioni.

+0

Grazie per la risposta. Sai se è possibile ottenere "-0,00000000000000024492935982947064" in fase di runtime? E come? –

+1

@Sanders '-fno-builtin' per assicurarsi che non venga utilizzata alcuna funzione incorporata, di solito aiuta a evitare che il risultato venga calcolato in fase di compilazione. Tuttavia, il risultato ottenuto non è normale, probabilmente c'è un bug nel compilatore o nella libreria. Dovresti provare ad aggiornare ad una nuova versione. – ouah

+0

@ouah OK, aggiornerò la mia versione g ++ e proverei. GRAZIE. –

Problemi correlati