我该如何对80位IEEE浮点进行相等测试?

时间:2008-12-10 04:33:52

标签: floating-point d bit-manipulation

与:

有关

但是关于x86上的80 bit IEEE floats(参见第8.2节)

特别是我喜欢this implementation使用操作数之间可表示值的计数,因为它默认会缩放。

一个用例是数值近似值,其中两个值彼此接近,我需要检查它们是否足够接近。


P.S。实现语言将是D但我可以翻译。此外,一个可以自动处理任何基础类型的实现(例如,如果只有64位真实可用)将是理想的。

The current code in use:

2 个答案:

答案 0 :(得分:2)

由于D内置了80位实数(据我所知),为什么不使用标准方法与epsilon值进行比较。如果您事先知道粗略范围,例如美国货币:

,则可以是固定值
if (abs (a - b) < 1e-6) // effectively equal

或可接受的相对误差,例如平均值的百万分之一:

if (abs (a - b) < ((a + b) / 2) / 1e6) // effectively equal

请记住,我不知道D,上面的代码仅用于演示目的。

答案 1 :(得分:0)

我目前的解决方案是

bool Near(real a, real b, int count = 5)
{
    // Returns the number of mantissa bits which are equal in x and y.
    int i = std.math.feqrel!(real)(a,b);
    return i + count >= real.mant_dig;
}

它给出了输入中未匹配位的数量。我不确定这会在2的权力附近有效。