c# - 为什么 1.0f + 0.0000000171785715f 返回 1f?

标签 c# .net floating-point precision

在尝试查找代码中的错误一小时后,我终于找到了原因。我试图向 1f 添加一个非常小的 float ,但没有任何反应。在试图弄清楚为什么我发现将那个小 float 添加到 0f 时效果很好。

为什么会这样? 这与“数量级”有关吗? 这个问题有什么解决方法吗?

提前致谢。

编辑:

目前无法更改为 double 或小数。

最佳答案

因为单精度(32 位)浮点值的精度是小数点后大约 7 位数字。这意味着您要添加的值基本上为零,至少在添加到 1 时是这样。然而,值本身可以毫不费力地存储在 float 中,因为在这种情况下指数很小。但是要成功地将它添加到 1,您必须使用较大数字的指数......然后零后的数字在四舍五入中消失。

如果需要更高的精度,可以使用double。就性能而言,这不会对当今的硬件产生影响,而且内存通常也不会像您必须考虑每个变量那样受到限制。

编辑: 正如您所说,使用 double 不是您可以使用的选项 Kahan summation , 作为 akuhn在评论中指出。

另一种选择可能是以 double 执行中间计算,然后再次转换为 float。然而,这只会在有更多操作而不仅仅是将一个非常小的数字加到一个较大的数字上时有所帮助。

关于c# - 为什么 1.0f + 0.0000000171785715f 返回 1f?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/697249/

相关文章:

c# - .NET 请求浏览器将 Opera 识别为 Chrome

c# - 为什么使用空 lambda 函数注册到事件会导致内存中的强引用?

c# - DependencyInjection 与 Cache 和 Repository 都实现相同的接口(interface)

c++ - 与正零 (+0.0) 相比,负零 (-0.0) 的行为

c# - 实体类型 'type' 处于阴影状态。有效的模型要求所有实体类型都具有相应的 CLR 类型

c# - 卡住 AutoFixture 中的枚举值

c - IEEE 754 和浮点精度

floating-point - MXCSR控制寄存器的范围?

c# - 根据角色限制用户可以做什么

c# - 我可以从泛型类型 T 继承泛型类吗?像 MyClass<T> : T