关于C语言中IEEE双精度浮点数计算及舍入模式的疑问
关于C语言中IEEE双精度浮点数计算及舍入模式的疑问
我现在在理解一个特定的IEEE双精度浮点数计算时遇到了麻烦,下面是一段C99程序,它运行在支持IEEE双精度(8字节、11位偏置指数、52位编码尾数)的主机上:
#include <stdio.h> #include <fenv.h> // Expect IEEE double int _a[sizeof (double) == 8 ? 1 : -1]; #define PP(X) printf (#X " = %d\n", X) int main (void) { // Print rounding modes. PP (FE_TONEAREST); PP (FE_UPWARD); PP (FE_DOWNWARD); PP (FE_TOWARDZERO); // What mode do we have? printf ("rounding mode = %d\n", fegetround()); // Add a and b. double a = -0x1.638e38e38e38ep5; double b = -0x1.638e38e38e38ep6; __asm ("" : "+r" (a)); __asm ("" : "+r" (b)); printf ("a = %a\n", a); printf ("b = %a\n", b); printf ("a+b = %a\n", a + b); return 0; }
编译并运行这个程序的命令如下:
$ gcc -std=c99 -Wall floating-point-test.c -o floating-point-test $ ./floating-point-test
我对这段程序中a + b的计算结果存在疑问,想搞清楚IEEE双精度浮点数的加法规则以及当前舍入模式对计算结果的影响。
备注:内容来源于stack exchange,提问作者emacs drives me nuts
相关产品推荐
相关产品推荐

