Hinzufügen von zwei Gleitkommazahlen
Ich möchte die Summe zweier IEEE 754 binary64-Zahlen aufgerundet berechnen. Zu diesem Zweck habe ich das folgende C99-Programm geschrieben:
#include <stdio.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
int main(int c, char *v[]){
fesetround(FE_UPWARD);
printf("%a\n", 0x1.0p0 + 0x1.0p-80);
}
Wenn ich mein Programm jedoch mit verschiedenen Compilern kompiliere und ausführe:
$ gcc -v … gcc version 4.2.1 (Apple Inc. build 5664) $ gcc -Wall -std=c99 add.c && ./a.out add.c:3: warning: ignoring #pragma STDC FENV_ACCESS 0x1p+0 $ clang -v Apple clang version 1.5 (tags/Apple/clang-60) Target: x86_64-apple-darwin10 Thread model: posix $ clang -Wall -std=c99 add.c && ./a.out add.c:3:14: warning: pragma STDC FENV_ACCESS ON is not supported, ignoring pragma [-Wunknown-pragmas] #pragma STDC FENV_ACCESS ON ^ 1 warning generated. 0x1p+0
Es funktioniert nicht (Ich habe das Ergebnis erwartet0x1.0000000000001p0
).
Tatsächlich wurde die Berechnung zur Kompilierungszeit im Standardmodus "Round-to-Nearest" durchgeführt:
$ clang -Wall -std=c99 -S add.c && cat add.s add.c:3:14: warning: pragma STDC FENV_ACCESS ON is not supported, ignoring pragma [-Wunknown-pragmas] #pragma STDC FENV_ACCESS ON ^ 1 warning generated. … LCPI1_0: .quad 4607182418800017408 … callq _fesetround movb $1, %cl movsd LCPI1_0(%rip), %xmm0 leaq L_.str(%rip), %rdx movq %rdx, %rdi movb %cl, %al callq _printf … L_.str: .asciz "%a\n"
Ja, ich habe die Warnung jedes Compilers gesehen. Ich verstehe, dass es schwierig sein kann, die anwendbaren Optimierungen auf der Skala der Linie zu aktivieren oder zu deaktivieren. Ich würde immer noch gerne, wenn das überhaupt möglich wäre, sie im Maßstab der Datei ausschalten, was ausreichen würde, um meine Frage zu lösen.
Meine Frage ist: Welche Befehlszeilenoptionen sollte ich mit GCC oder Clang verwenden, um eine C99-Kompilierungseinheit zu kompilieren, die Code enthält, der mit einem anderen als dem Standard-FPU-Rundungsmodus ausgeführt werden soll?
AbschweifungAls ich diese Frage recherchierte, fand ich diesKompatibilitätsseite zu GCC C99, mit dem Eintrag unten, den ich nur hier lassen werde, falls jemand anderes es lustig findet. Grrrr.
floating-point | | environment access | N/A | Library feature, no compiler support required. in <fenv.h> | |