c - 在 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
解决方案
在 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。
推荐阅读
- node.js - 面向用户细分/受众的数据库模型 Merise
- wordpress - 根据重量和单位销售时,如何在 WooCommerce 中的价格后添加 /kg 或 /each
- deep-learning - tf.data.Dataset:不能为给定的输入类型指定 `batch_size` 参数
- python - 从字典列表中获取数据
- pde - Fenics中的复数
- reactjs - React Hooks:无法访问更新的 useState 变量
- apache - 在 Alpine 上运行 Apache 后的 SSH docker 容器问题
- r - 使用 switch 函数代替嵌套的 if 函数
- flutter - 无法使用静态访问访问 Flutter 实例成员“{0}”
- java - 我在 Selenium 中的程序没有停止执行是什么?