与:
有关但是关于x86上的80 bit IEEE floats(参见第8.2节)
特别是我喜欢this implementation使用操作数之间可表示值的计数,因为它默认会缩放。
一个用例是数值近似值,其中两个值彼此接近,我需要检查它们是否足够接近。
P.S。实现语言将是D但我可以翻译。此外,一个可以自动处理任何基础类型的实现(例如,如果只有64位真实可用)将是理想的。
答案 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的权力附近有效。