我有一个程序有两个 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/