Il seguente programma (adattato da here) sta dando risultati incoerenti quando compilato con GCC (4.8.2) e Clang (3.5.1). In particolare, il risultato GCC non cambia anche se lo fa FLT_EVAL_METHOD
.Same FLT_EVAL_METHOD, risultati diversi in GCC/Clang
#include <stdio.h>
#include <float.h>
int r1;
double ten = 10.0;
int main(int c, char **v) {
printf("FLT_EVAL_METHOD = %d\n", FLT_EVAL_METHOD);
r1 = 0.1 == (1.0/ten);
printf("0.1 = %a, 1.0/ten = %a\n", 0.1, 1.0/ten);
printf("r1=%d\n", r1);
}
Test:
$ gcc -std=c99 t.c && ./a.out
FLT_EVAL_METHOD = 0
0.1 = 0x1.999999999999ap-4, 1.0/ten = 0x1.999999999999ap-4
r1=1
$ gcc -std=c99 -mpfmath=387 t.c && ./a.out
FLT_EVAL_METHOD = 2
0.1 = 0x0.0000000000001p-1022, 1.0/ten = 0x0p+0
r1=1
$ clang -std=c99 t.c && ./a.out
FLT_EVAL_METHOD = 0
0.1 = 0x1.999999999999ap-4, 1.0/ten = 0x1.999999999999ap-4
r1=1
$ clang -std=c99 -mfpmath=387 -mno-sse t.c && ./a.out
FLT_EVAL_METHOD = 2
0.1 = 0x0.07fff00000001p-1022, 1.0/ten = 0x0p+0
r1=0
noti che, secondo this blog post, GCC 4.4.3 utilizzato all'uscita 0 anziché 1 nella seconda prova.
A possibly related question indica che un bug è stato corretto in GCC 4.6, il che potrebbe spiegare perché il risultato di GCC è diverso.
Vorrei confermare se uno di questi risultati sarebbe errato o se alcune sottili fasi di valutazione (ad esempio una nuova ottimizzazione del preprocessore) giustificherebbero la differenza tra questi compilatori.
Ho dovuto indagare recentemente sul comportamento delle vecchie versioni di GCC e qualcuno mi ha indirizzato a https://gcc.godbolt.org che è stato molto utile. Non ha GCC 4.4.3, ma ha 4.4.7. –