提问人:Kelly Bundy 提问时间:7/6/2022 最后编辑:Kelly Bundy 更新时间:7/7/2022 访问量:123
最小的 i 有 1/i == 1/(i+1)?
Smallest i with 1/i == 1/(i+1)?
问:
有人反向排序而不是通常的排序,这让我想知道:失败的最小正整数情况是什么*?我认为它一定是两个连续的整数并且具有相同的倒数。我发现的最小的是:1/i
-i
i
i+1
float
i = 6369051721119404
i = 6369051721119404
print(1/i == 1/(i+1))
import math
print(math.log2(i))
输出(在线试用!
True
52.50000001100726
请注意,它只比 252.5 大一点(我只是在用其他方式找到数字后才注意到的),而 52 是 存储的尾数位,所以也许这很有意义。float
那么:它失败的最小是什么?是我找到的那个吗?为什么有没有一个有意义的解释?
*这意味着它无法正确排序,例如不会反转该列表,因为两个键值相同。sorted([6369051721119404, 6369051721119405], key=lambda i: 1/i)
答:
假设介于 和 对于某些 .i
2^n
2^(n+1)
n
然后是介于 和 之间。它作为双精度浮点的表示是 ,其中有 52 个 x。在该幅度下可以表示的最小差异是 。1/i
2^(-n-1)
2^-n
1.xxx...xxx * 2^(-n-1)
2^-52 * 2^(-n-1) = 2^(-n-53)
1/i
如果它们之间的差值最多是 ,则可能会四舍五入到相同的数字。求解 : ==> .解决方案约为 。这与我们的 if 范围相匹配。然后。1/(i+1)
2^(-n-53)
i
1/i - 1/(i+1) = 2^(-n-53)
i(i+1) = 2^(n+53)
i = 2^((n+53) / 2)
i
n = 52
i = 2^52.5
从这个值开始,有可能得到 和 的相同值。但这不会发生在每个人身上,因为这取决于数字的四舍五入方式。我们可以在那个时候开始搜索,正如你在那之后不久发现的那样,我们会找到第一个出现。i
1/i
1/(i+1)
i
注意:我们还需要排除 n=51,因为它似乎有落在范围内的解决方案。但是,唯一介于 2^51 到 2^52 范围内且至少是上面计算的最小值的整数是 2^52 本身,可以排除。对于较大的值,我们需要切换到 n=52,如上所述。i
评论
1/i