首页 > 解决方案 > 在 C 中舍入的情况下,浮点数究竟如何存储在内存中

问题描述

我对浮点计算进行了研究,我了解它是如何存储的以及不准确的原因,但是对于以下情况,我认为它是异常值。任何人都可以请帮助为什么会这样。

Source Code - 
int main()
{        
          float f = 3.9999999f;
          printf("%f",f);
}

Output - 
4.000000

[问题 - 为什么 4.000000 我做了计算,但我得到了 3.099999976158142089844]

谁能帮我解决这个问题。

编译器规范
- 使用内置规范。
COLLECT_GCC=somepath\gcc.exe

目标:mingw32
线程模型:win32
gcc 6.3.0版(MinGW.org GCC-6.3.0-1)

我参考了解浮点计算的视频 - https://www.youtube.com/watch?v=iV-K-gNDC5A

标签: cfloating-point

解决方案


在 IEEE-754 单精度 aka binary32 常用的格式中float,最接近 3.9999999 的两个可表示值是 3.9999997615814208984375 和 4。(3.9999997615814208984375 是 16,777,215•2 -22。)

3.9999997615814208984375 和 3.9999999 之间的距离约为 1.4•10 -7。4 和 3.9999999 之间的距离为 1•10 -7。所以 4 比 3.9999997615814208984375 更接近 3.9999999。因此,四舍五入到最接近的可表示值的 C 实现将产生 4 for 3.9999999f。因此float f = 3.9999999f;初始化f为 4。


推荐阅读