提问人:Daniel Resnick 提问时间:6/29/2023 最后编辑:Daniel Resnick 更新时间:6/30/2023 访问量:51
确保 IEEE 754 双精度浮点数之间至少有 N 个不同的偶数步长
Ensure there are at least N distinct even steps between IEEE 754 double precision floating point numbers
问:
如果我有两个任意的双精度浮点数 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 等阈值。
答:
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。
[*]:具有相同符号的有限值在其位表示中是“密集”的。
评论
float
Distance
Distance(A, B)
N
N
A
B
N