我有一个程序,有两个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);
Run Code Online (Sandbox Code Playgroud)
第一个printf中写入的值与第二个printf写入的值不同(当打印6个小数位时,为0.000001).
在划分之前,值是:
num = 10201
other_num = 2282
Run Code Online (Sandbox Code Playgroud)
我已将结果数字打印到15位小数.这些数字在小数点后7位有所不同,这解释了第6位的差异.
以下是15位小数的数字:
4.470201577563540
4.470201492309570
Run Code Online (Sandbox Code Playgroud)
我知道浮点舍入问题,但我期望在赋值和printf参数中执行时计算结果是相同的.
为什么这个期望不正确?
谢谢.
可能是因为FLT_EVAL_METHOD你的系统上的东西不是0.
在第一种情况下,表达式(float) num / other_num具有标称类型float,但可能以更高的精度进行评估(如果您使用的是x86,可能long double).它然后转换double为传递给printf.
在第二种情况下,将结果分配给类型的变量float,这会强制丢弃过多的精度.在float随后晋升为double当传递给printf.
当然没有实际数字,这只是猜测.如果您需要更明确的答案,请提供有关问题的完整详细信息.