c语言中浮点数四舍五入背后的逻辑是什么



我用c语言编写了一个程序来舍入浮点数,但程序的输出不遵循任何逻辑。代码是-->

#include<stdio.h>
int main(){
float a=2.435000;
float b=2.535000;
float c=2.635000;
float d=2.735000;
float e=2.835000;
//Rounding off the floating point numbers to 2 decimal places
printf("%f  %.2fn",a,a);
printf("%f  %.2fn",b,b);
printf("%f  %.2fn",c,c);
printf("%f  %.2fn",d,d);
printf("%f  %.2fn",e,e);

return 0;
}

输出:

2.435000 2.43

2.535000 2.54

2.635000 2.63

2.735000 2.73

2.835000 2.84

所有浮点数都具有相同的数字模式,即它们是2.x35000的形式,其中x在不同的数字中不同。我不明白为什么他们在取整时表现出不同的行为,他们应该给出2.x3或2.x4,但对于不同的x,给出的值不同。

这背后的逻辑是什么?

在您和我看来,2.435是一个不错的四舍五入小数
在你和我看来,如果我们四舍五入到两位,我们会得到2.44。
但大多数计算机内部都不使用小数,而你和我使用的计算机绝对不使用小数。他们使用二进制分数,二进制分数可能令人惊讶。

从内部来看,数字2.435不能用二进制表示。作为float,它在内部表示为二进制分数,相当于2.434999942779541015625。这非常接近2.435,但你可以看到,如果你把它四舍五入到两个位置,你会得到2.43。

同样的论点可以解释你的其他结果。2.635实际上是2.6349999904632568359375,所以它四舍五入到2.63。但2.535是2.535000585306884765625,所以正如你所料,它的四舍五入是2.54。

为什么我们不能更接近2.435呢?正如我所说,在内部,它是一个二进制分数,相当于2.434999942779541015625。实际的IEEE-754单精度表示为0x401bd70a,其计算结果为0x0.9bd70a × 2²,或0.60874998569488525390625×22。但如果我们";加1";也就是说,如果我们把它做得尽可能大一点,下一个float值是0x401bd70b,即0x0.9bd70b或0.60875004529530029296875×22,即2.4350001811981201171875,最终离2.435有点远。(实际上,它的距离是它的三倍多。第一个数字相差0.000000057;第二个数字相差000000181。(

你可以在这些其他的";规范的";SO问题:

  • 浮点数学坏了吗
  • 为什么浮点数不准确

就在过去的几天里,还有两个有趣的问题被问到:

  • 为什么>操作员工作不正常
  • 浮点舍入效应的解释

相关内容

  • 没有找到相关文章

最新更新