有人可以给我一个解释,为什么我得到两个不同的数字。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。
...为什么我得到两个不同的数字...
除了通常的浮点问题外,到达b
和的计算路径c
也以不同的方式到达。c
通过首先将值另存为来计算double a
。
double a =(Vmax-Vmin)/step;
int b = (Vmax-Vmin)/step;
int c = a;
C允许使用更广泛的类型来计算中间浮点数学。检查FLT_EVAL_METHOD
from 的值<float.h>
。
除了分配和转换(删除所有额外的范围和精度)外,...
-1不确定
0仅计算类型的范围和精度的所有运算和常量;
1评估操作和类型的常量
float
和double
向范围和精度double
类型,评估long double
操作和常数的范围和精度long double
类型;2对
long double
类型的范围和精度评估所有运算和常量。C11dr§5.2.4.2.29
运营报告2
通过将商保存为double a = (Vmax-Vmin)/step;
,可以强制精度为,double
而int b = (Vmax-Vmin)/step;
可以计算为long double
。
这种细微的差异是由(Vmax-Vmin)/step
(计算为long double
)另存为a double
相对于保留a引起的long double
。一个为15(或略高于15),另一个为15以下。int
截断会将这种差异放大为15和14。
在另一个编译器上,由于FLT_EVAL_METHOD < 2
或其他浮点特性,结果可能都相同。
int
从浮点数到数字接近整数的转换非常严重。往往更好地round()
或lround()
。最佳解决方案取决于具体情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句