如何在浮动形式中区分零和非常小的数字

时间:2016-04-19 04:58:51

标签: c floating-point precision

我即将开发一个科学计算器。我的问题是: 如何使用浮点数区分零结果和非常小的数字?

例如,对于0.3 - 0.2 - 0.1,结果类似于1E-19,这不是纯零(当然是精度问题)。我想打印出结果(0.0)。所以我使用EPSILON与零进行比较。

问题是,对于计算:3E-19 - 2E-19,结果应为1E-19。我应该打印出确切的结果(尽管很小)1E-19。但如果我仍然使用EPSILON比较,结果将被强制为零。

所以,我的问题是:我如何检查零和非常小的数字?

4 个答案:

答案 0 :(得分:5)

如果使用二进制浮点数据类型,这本身就不可能。

相反,如果您想要精确控制数字精度和舍入,则应使用十进制数字库,例如GNU Multiprecision (GMP)Boost.Multiprecision

答案 1 :(得分:2)

你说0.3-0.2-0.1不是0而是1E-19。实际上它已浮动(0.3)-float(0.2)-float(0.1)不再为0.除非你明确检查0.3是否可以浮动或双无损编码然后你无法检查是否计算后得到的小数字是由于操作数错误或实际上是一个小数字。

答案 2 :(得分:0)

如果您没有碰到它,this page基本上是浮点数比较的最后一个词。

但是我认为你的问题归结为根据操作数和已执行的操作知道需要什么精度。您可以从操作数之间的最大ULP判断出来。如果操作数之间存在大的ULP,那么您可能需要显示更精确的答案(最多可以浮动请求表示的精度限制)。可能值得尝试这些方面的东西。

答案 3 :(得分:0)

当然,如果代码使用1.0 - 7*(1.0/7.0)(二进制FP)或者基数为2,10的高精度库,科学计算器会遇到像double 这样的方程式,而不管

使用十进制浮点库最小化小数输入(例如0.1, 0.2, 0.3)出现的舍入错误问题。

"我想打印出结果(0.0)。所以我使用EPSILON与零进行比较。"因为FP数字具有对数分布而失败。

考虑因素:允许用户控制显示的输出的格式。实质上,这允许用户设置EPSILON。例如。 "%.17f"0.3 - 0.2 - 0.1将为零。