将双精度数字分配给C中的int变量的非直观结果

GeorgiD:

有人可以给我一个解释,为什么我得到两个不同的数字。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。

chux-恢复莫妮卡:

...为什么我得到两个不同的数字...

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

double a =(Vmax-Vmin)/step;
int b = (Vmax-Vmin)/step;
int c = a;

C允许使用更广泛的类型来计算中间浮点数学。检查FLT_EVAL_METHODfrom 的值<float.h>

除了分配和转换(删除所有额外的范围和精度)外,...

-1不确定

0仅计算类型的范围和精度的所有运算和常量;

1评估操作和类型的常量floatdouble向范围和精度double类型,评估long double操作和常数的范围和精度long double类型;

2对long double类型的范围和精度评估所有运算和常量

C11dr§5.2.4.2.29

运营报告2

通过将商保存为double a = (Vmax-Vmin)/step;,可以强制精度为,doubleint 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章