c - math.h 默认舍入模式不明确

标签 c math floating-point type-conversion rounding

我面临着关于 float 舍入和转换为 int 的非常奇怪的事实。

正如此处所述: http://www.gnu.org/software/libc/manual/html_node/Rounding.html

四舍五入到最接近的可表示值是默认的四舍五入模式。但好像不是。

所以我创建了这个简单的程序:

#include <fenv.h>
#include <stdio.h>

int a;
double b;

main() {
  b=1.3; a=b; printf("%f %d\n",b,a);
  b=1.8; a=b; printf("%f %d\n",b,a);
  b=-1.3; a=b; printf("%f %d\n",b,a);
  b=-1.8; a=b; printf("%f %d\n",b,a);
  printf("%d %d %d\n",fegetround(),FE_TONEAREST,FE_TOWARDZERO);
}

程序是用 gcc-4.7 (debian)、cygwin gcc 和 Visual studio 编译的。输出相同,只是 FE_TOWARDZERO 的定义发生了变化。

程序输出:

 1.300000 1
 1.800000 1
-1.300000 -1
-1.800000 -1
0 0 3072

因此我们可以清楚地看到,在所有测试的编译器中,舍入模式都设置为 FE_TONEAREST(默认),但它们都向零舍入。

为什么?

PS:是的,我可以使用 Math.round() 但我想知道为什么会这样。

最佳答案

因为舍入模式适用于浮点舍入函数。转换为 int 总是会被截断。

关于c - math.h 默认舍入模式不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16851904/

相关文章:

python - 如何计算python中矩阵的平衡?

c++ - 下面的代码应该为 4 和 0 的输入打印 120.000000。但它只显示 120。为什么?以及如何获得所需的输出?

python - 在 Python 中将字符串转换为 float

python - 如何在python中算术时检测溢出?

algorithm - 如何最小化已知为 U 形的整数函数?

c - 如何在C中打开一个进程?

计算 WCHAR 字符串中的字符数

c - 解压 16 位 BCD 的最有效公式? (例如 0x1234 到 0x01020304)

c - 具有特定格式的 Scanf

java - 利用三点求角度