Добавление двух чисел с плавающей точкой

Я хотел бы вычислить сумму округленных в большую сторону двух двоичных чисел IEEE 754. С этой целью я написал программу C99 ниже:

#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);
}

Однако, если я скомпилирую и запусту свою программу с различными компиляторами:

$ 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

Это не работает! (Я ожидал результата0x1.0000000000001p0).

Действительно, вычисление было выполнено во время компиляции в режиме округления до ближайшего по умолчанию:

$ 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"

Да, я видел предупреждение от каждого компилятора. Я понимаю, что включение или выключение соответствующих оптимизаций в масштабе линии может быть сложным. Я все еще хотел бы, если это вообще было возможно, отключить их в масштабе файла, что было бы достаточно, чтобы решить мой вопрос.

Мой вопрос: какие параметры командной строки следует использовать с GCC или Clang, чтобы скомпилировать модуль компиляции C99, содержащий код, предназначенный для выполнения с режимом округления FPU, отличным от режима по умолчанию?

отступление

Исследуя этот вопрос, я нашел этоСтраница соответствия GCC C99, содержащий запись ниже, что я просто оставлю здесь, если кто-то еще посчитает это смешным. Grrrr.

floating-point      |     |
environment access  | N/A | Library feature, no compiler support required.
in <fenv.h>         |     |

Ответы на вопрос(1)

Ваш ответ на вопрос