floating-point - 在C 中,将双精度数指定为一个int变量的浮点结果

  显示原文与译文双语对照的内容
83 3

谁能给我一个解释为什么我得到两个不同的数字。 14和 15,作为以下代码的输出?


#include <stdio.h> 



int main()


{


 double Vmax = 2.9; 


 double Vmin = 1.4; 


 double step = 0.1; 



 double a =(Vmax-Vmin)/step;


 int b = (Vmax-Vmin)/step;


 int c = a;



 printf("%d %d",b,c);//14 15, why?


 return 0;


}



我希望两种情况下都能获得 15,但似乎我缺少语言的一些基本知识。

我不确定它是否相关,但我在CodeBlocks中做测试。 但是,如果在行编译器( 这个例子。) 中键入相同的代码行,则会得到两个打印变量的15个答案。

时间: 原作者:

148 2

。为什么我得到两个不同的号码。

除了常见的浮点问题外,bc的计算路径也以不同的方式到达。 通过首先将值保存为 double a 来计算 c


double a =(Vmax-Vmin)/step;


int b = (Vmax-Vmin)/step;


int c = a;



C 允许使用更宽的类型计算中间浮点数学。 从 <float.h> 检查 FLT_EVAL_METHOD的值。

除了赋值和铸造( 去除所有额外的范围和精度) 。

-1无法确定;

0 将所有操作和常量评估为类型的范围和精度;

1 对类型和类型的运算和常数求值为 double 类型的范围和精度,评估 long double 操作和常数到 long double 类型的范围和精确度;

2 计算 long double 类型的范围和精度的所有操作和常数。

C11dr § 5.2.4.2. 2 9

OP 报告 2

通过节约商 double a = (Vmax-Vmin)/step; 精度被强制为 double,而 int b = (Vmax-Vmin)/step; 可以作为 long double 计算。

这个细微差别是由于 (Vmax-Vmin)/step ( 计算为 long double ) 被保存为 double 而不是 long double 。 一个为 15 ( 或者只是上),另一个为 15. int 截断将这里差异放大到 15和 14.

在另一个编译器上,由于 FLT_EVAL_METHOD <2 或者其他浮点特性,结果可能都是相同的。

从浮点数转换到 int 是严重的,数字接近整数。 round() 或者 lround() 通常更好。 最好的解决方案是 situation 。

原作者:
...