Adicionando dois números de ponto flutuante
Gostaria de calcular a soma, arredondada, de dois números IEEE 754 binary64. Para esse fim, escrevi o programa C99 abaixo:
#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);
}
No entanto, se eu compilar e executar meu programa com vários compiladores:
$ 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
Isso não funciona! (Eu esperava o resultado0x1.0000000000001p0
)
De fato, a computação foi feita em tempo de compilação no modo padrão arredondar para o mais próximo:
$ 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"
Sim, vi o aviso emitido por cada compilador. Entendo que ativar ou desativar as otimizações aplicáveis na escala da linha pode ser complicado. Eu ainda gostaria, se isso fosse possível, desativá-los na escala do arquivo, o que seria suficiente para resolver minha pergunta.
Minha pergunta é: quais opções de linha de comando devo usar com o GCC ou o Clang para compilar uma unidade de compilação C99 que contém código destinado a ser executado com um modo de arredondamento da FPU diferente do padrão?
DigressãoAo pesquisar essa pergunta, encontrei estePágina de conformidade com o GCC C99, contendo a entrada abaixo, que deixarei aqui caso alguém ache engraçado. Grrrr.
floating-point | | environment access | N/A | Library feature, no compiler support required. in <fenv.h> | |