相关:
但是关于x86 上的80 位 IEEE 浮点数(参见第 8.2 节)
特别是我喜欢使用操作数之间的可表示值计数的这种实现,因为它默认缩放。
一个用例是数值近似,其中两个值彼此接近,我需要检查它们是否足够接近。
ps 实现语言是D,但我可以翻译。此外,可以自动处理任何底层类型的实现(例如,如果只有 64 位实数可用)将是理想的。
相关:
但是关于x86 上的80 位 IEEE 浮点数(参见第 8.2 节)
特别是我喜欢使用操作数之间的可表示值计数的这种实现,因为它默认缩放。
一个用例是数值近似,其中两个值彼此接近,我需要检查它们是否足够接近。
ps 实现语言是D,但我可以翻译。此外,可以自动处理任何底层类型的实现(例如,如果只有 64 位实数可用)将是理想的。
由于 D 内置了 80 位实数(据我所知),您为什么不只使用与 epsilon 值进行比较的标准方法。如果您事先知道粗略的范围,这可以是一个固定值,例如美元:
if (abs (a - b) < 1e-6) // effectively equal
或可接受的相对误差,例如平均值的百万分之一:
if (abs (a - b) < ((a + b) / 2) / 1e6) // effectively equal
请记住,我不知道 D,上面的代码仅用于演示目的。
我目前的解决方案是
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 的幂附近效果如何。