确保 IEEE 754 双精度浮点数之间至少有 N 个不同的偶数步长

Ensure there are at least N distinct even steps between IEEE 754 double precision floating point numbers

提问人:Daniel Resnick 提问时间:6/29/2023 最后编辑:Daniel Resnick 更新时间:6/30/2023 访问量:51

问:

如果我有两个任意的双精度浮点数 A 和 B,其中 A 是 <= B,有没有办法确定范围 A 到 B 是否可以分成 N 个均匀分布(忽略舍入误差)A 和 B 之间的双精度浮点数,这些浮点数是不同的,并且遵循严格的总<排序, 每步的值为 A+(B - A)/(N+1)*X,其中 X = [1...N]?例:

A=0
B=1
N=5

Result: [0, 1/6, 2/6, 3/6, 4/6, 5/6, 1]

在这种情况下,很明显,这些数字中的每一个都“适合”,我们不必担心精度损失/舍入错误会导致违反<顺序。但是,如果 A=0 且 B=0.0000000000001,那么这是否“安全”就不那么明显了,因为即使有足够的“空间”来表示 A 和 B 之间的 N 个附加值,也不清楚 A+(B - A)/(N+1)*X 计算中的舍入误差是否会导致值不遵守严格的总<排序。

我知道“每个计算机科学家都应该知道的关于浮点运算的知识”,但它特别密集,很难转化为像这样的更高层次的要点。我希望得到一个稳健的答案,但我愿意承认一个“实际”的答案,例如,也许我应该确保 (B-A)/N 始终大于 0.01 等阈值。

精度 IEEE-754

评论

0赞 Eric Postpischil 6/29/2023
这里有 C++ 代码来计算两个值之间有多少个可表示值(对于,很容易适应其他类型)。该函数计算一个端点,因此,如果大于或等于 +1,则 和 之间至少存在可表示的值。是否有一组“(大致)均匀分布”的值取决于您对“(大致)均匀分布”的定义。floatDistanceDistance(A, B)NNABN
0赞 lijie 6/29/2023
如果 B > A >= 0,并且您想要 B - A 形式的内容> N * k,并且 N 可以用尾数的位数表示,那么使用 k = std::nextafter(A, B) - A 应该没问题。
0赞 Daniel Resnick 6/30/2023
我编辑了原始问题,以澄清均匀分布的方面。我想我真正想弄清楚的是,我如何量化 A+(B - A)/(N+1)*X 计算的误差边界,并保证使用起点 A、B 和 N,结果将始终遵循严格的总排序(即没有两个值相等,并且每个后续值都大于前一个值)?

答:

0赞 lijie 6/29/2023 #1

假设 A 和 B 是非负的和有限的,你可以 (ab) 使用 totalOrder 谓词 [*] 来确定 (A, B) 中是否至少有 N 个不同的表示形式:

bit_cast_to_int(最大值(A, B)) - bit_cast_to_int(最小值(A, B)) > N.

如果 A 和 B 只是有限的,那么可能分别计算正负部分,并注意不要重复计算 -0 和 0。

[*]:具有相同符号的有限值在其位表示中是“密集”的。