【发布时间】:2011-03-07 02:44:51
【问题描述】:
我有一个在 .NET 中处理一些地理坐标的方法,并且我有一个存储坐标对的结构,这样如果为其中一个坐标传入 256,它就会变为 0。但是,在一个特定的实例中计算出大约 255.99999998 的值,并因此存储在结构中。当它在 ToString() 中打印时,它变成 256,这不应该发生 - 256 应该是 0。我不介意它是否打印 255.9999998,但是当调试器显示 255.99999998 时它打印 256 是一个问题。同时存储和显示 0 会更好。
特别是比较存在问题。 255.99999998 足够接近 256 以至于它应该等于它。比较双打时应该怎么做?使用某种 epsilon 值?
编辑:具体来说,我的问题是我取一个值,执行一些计算,然后对该数字执行相反的计算,我需要准确地取回原始值。
【问题讨论】:
-
使用 epsilon 是比较浮点值的唯一合法方法。绝对(a - b)
-
用 == 比较两个浮点数是完全合法的,因此几乎没有编译器抱怨它。但是,最小的舍入误差可能会导致两个值在数学上应该相等时不相等,这就是为什么如果您重视自己的理智,则不建议这样做。
-
如果你真的只需要准确地取回原始值,你不能把它存储起来,或者一些关于原始计算过程的信息和数字一起存储吗?
标签: math floating-point double floating-accuracy epsilon