代码之家  ›  专栏  ›  技术社区  ›  BCS

如何对80位ieee浮点进行相等测试?

  •  2
  • BCS  · 技术社区  · 16 年前

    相关:

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

    尤其是我喜欢 this implementation 在操作数之间使用可表示值的计数,因为它在默认情况下是可缩放的。

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


    P.S.实现语言是D,但我可以翻译。另外,一个能够自动处理底层类型(例如,如果只有64位实数可用)的实现也是理想的。

    The current code in use:

    2 回复  |  直到 16 年前
        1
  •  2
  •   BCS    16 年前

    既然d内置了80位real(据我所知),为什么不直接使用与epsilon值比较的标准方法呢?如果您事先知道大致范围(如美元),则这可能是一个固定值:

    if (abs (a - b) < 1e-6) // effectively equal
    

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

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

    记住,我不知道D,上面的代码只是为了演示。

        2
  •  0
  •   BCS    16 年前

    我现在的解决方案是

    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次方附近会有多好。