2

相关:

但是关于x86 上的80 位 IEEE 浮点数(参见第 8.2 节)

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

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


ps 实现语言是D,但我可以翻译。此外,可以自动处理任何底层类型的实现(例如,如果只有 64 位实数可用)将是理想的。

当前使用的代码:

4

2 回答 2

2

由于 D 内置了 80 位实数(据我所知),您为什么不只使用与 epsilon 值进行比较的标准方法。如果您事先知道粗略的范围,这可以是一个固定值,例如美元:

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

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

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

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

于 2008-12-10T06:04:13.930 回答
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 的幂附近效果如何。

于 2008-12-10T06:03:58.143 回答