【问题标题】:MathNet real double precision issueMathNet 真正的双精度问题
【发布时间】:2016-06-20 18:25:42
【问题描述】:

我需要编写一个函数来比较字符串值“15.0000000000000001”和“15”,我正在使用 MathNet。使用 MathNet.Symbolics.Expression.Real 只接受双精度。当我执行以下操作时

Expression valOne = Expression.Real(Double.Parse("15.0000000000000001"));
Expression valTwo = Expression.Real(Double.Parse("15"));

valOne.Equals(valTwo);

以上计算结果为 true。Double.Parse 15.0000000000000001 返回 15。我知道小数点后的 0 对 double 没有意义,并且有存储限制。

有人可以帮忙吗?

【问题讨论】:

标签: c# .net mathnet-numerics


【解决方案1】:

根据经验,浮点数最多可以容纳 14 个连续数字以及 10 的幂。例如它会将 12.345678901234 存储为 1.2345678901234,幂为 1:将这两个数字相乘,即可得到存储的数字。

在您的示例中,从第一个 1 到最后一个 1 的跨度为 18 位。浮点数无法将其存储在可用空间中,因此它会丢弃最低有效位 - 在本例中为最后的 1。这是您的示例中的两个数字应该匹配。

但是,如果您将 12.345678901234 与 12.345678901235 进行比较,则不相等。

请注意,我提到的 14 位十进制数字是一个经验法则。根据这些数字的值,它可能会更少。

是的:这确实意味着浮点数不是精确的,它们是近似值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多