寻找接近的浮点数之间的“离散”差异

Sza*_*lcs 5 floating-point numerical x87

假设我有两个浮点数xy,它们的值非常接近。

计算机上可以表示离散数量的浮点数,因此我们可以按升序枚举它们:f_1, f_2, f_3, ...x我希望找到和在此列表中的距离y(即它们是 1、2、3、... 还是n离散步长?)

是否可以仅使用算术运算(+-*/)而不查看二进制表示来做到这一点?我主要感兴趣的是它在 x86 上的工作原理。

假设 和y > x之间x只有y几步(例如 < 100),下面的近似值是否正确?(可能不会 ...)

(y-x) / x / eps
Run Code Online (Sandbox Code Playgroud)

这里eps表示机器 epsilon。(机器 epsilon 是 1.0 和下一个最小浮点数之间的差。)

Nem*_*emo 1

我认为,您不必直接检查二进制表示形式,但您必须依赖它才能获得准确的答案。

首先使用frexp()将 x 分解为指数exp和尾数。我相信下一个大于 x 的浮点数是x + eps * 2^(exp-1)。(“-1”是因为 frexp 返回 [1/2, 1) 范围内的尾数,而不是 [1, 2)。)

如果 x 和 y 具有相同的指数,则基本完成。否则,您需要计算 2 的幂有多少步,即1.0/eps。换句话说,2^n 和 2^(n+1) 之间的步数为1.0/eps

因此,对于 y > x,计算从 x 到下一个 2 的幂有多少步;然后计算需要多少步才能得到小于 y 的最大 2 次方;然后计算从那里到 y 还需要多少步。我认为,所有这些都可以很容易地用 来表达eps