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?

Abschweifung

Als 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>         |     |

Antworten auf die Frage(1)

Ihre Antwort auf die Frage