c - 分配和 printf 之间的不同舍入

标签 c floating-point

我有一个程序有两个 int 类型的变量。

int num;
int other_num;

/* change the values of num and other_num with conditional increments */

printf ("result = %f\n", (float) num / other_num);

float r = (float) num / other_num;
printf ("result = %f\n", r);

第一个 printf 写入的值与第二个 printf 写入的值不同(0.000001,当以 6 位小数打印时)。

除法前的值为:

num = 10201 
other_num = 2282

我已将结果数字打印到小数点后 15 位。这些数字在小数点后第 7 位出现差异,这解释了小数点后第 6 位的差异。

以下是小数点后 15 位的数字:

4.470201577563540
4.470201492309570

我知道 float 舍入问题,但我希望计算结果在赋值和 printf 参数中执行时是相同的。

为什么这个期望不正确?

谢谢。

最佳答案

可能是因为 FLT_EVAL_METHOD 在您的系统上不是 0。

在第一种情况下,表达式 (float) num/other_num 具有标称类型 float,但可能会以更高的精度求值(如果您使用的是 x86,可能是 long double)。然后将其转换为 double 以传递给 printf

在第二种情况下,您将结果分配给类型为 float 的变量,这会强制删除过高的精度。当传递给 printf 时,float 会被提升为 double

当然,没有实际数字,这一切都只是猜测。如果您想要更明确的答案,请提供有关您的问题的完整详细信息。

关于c - 分配和 printf 之间的不同舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618660/

相关文章:

c - 如何将结构成员定义为其他成员的总和

c - 如何在 OS X 中禁用 .text 重定位?

java - 从 Java 程序编译 C 程序

c - 错误 : redefinition of "a static variable" in C header files

java - 使用java的浮点值精度丢失

c++ - Libc hypert 函数似乎为 double 类型返回错误的结果...为什么?

language-agnostic - 我们应该将 float 的相等性与*相对*错误进行比较吗?

使用 popen 更改目录

c++真正的大浮点计算

c - 如何在 C 中存储 10 位浮点值