最小的 i 有 1/i == 1/(i+1)?

Smallest i with 1/i == 1/(i+1)?

提问人:Kelly Bundy 提问时间:7/6/2022 最后编辑:Kelly Bundy 更新时间:7/7/2022 访问量:123

问:

有人反向排序而不是通常的排序,这让我想知道:失败的最小正整数情况是什么*?我认为它一定是两个连续的整数并且具有相同的倒数。我发现的最小的是:1/i-iii+1floati = 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)

Python IEEE-754 浮点精度

评论

2赞 chepner 7/6/2022
这取决于托管 Python 实现的底层平台提供的浮点支持。Python 本身没有定义任何特定的浮点行为。
0赞 Kelly Bundy 7/6/2022
@chepner使用 IEEE-754,如标记所示。64 位。几乎(?)每个人的 Python 都可能使用过。(好吧,也许仍然可以设置一些配置可能性,至少是舍入模式,但可能几乎没有人这样做。我确实相信这对几乎每个人来说都是一样的。
0赞 Kelly Bundy 7/6/2022
@chepner 回答说它几乎无处不在是 IEEE 754 binary64(由非常参与该主题的人提供)。
0赞 Eric Postpischil 7/8/2022
@KellyBundy:请记住,几乎无处不在,民族国家和资金雄厚的犯罪分子都渴望利用他们能找到的任何弱点。这使得我们大多可以忽略罕见情况的心态非常危险。即使这个问题并不特别重要,也应该避免将其作为一种习惯性的思维方式。
1赞 Kelly Bundy 7/8/2022
@EricPostpischil我不会把这种“心态”应用到任何地方。另外,这主要是与切普纳的评论的快速对比,在我看来,这听起来比实际情况要糟糕得多,就好像我们实际上对此无话可说,也无法从中学到任何东西。此外,在这种情况下,我真的不会受到这些状态/罪犯的任何威胁,因为我永远不会那样使用。我只是好奇,想学习(和分享)一些关于花车的东西。话又说回来,我可能会在其他地方使用所获得的知识。不适用于任何地方并不意味着它在任何地方都没有用。1/i

答:

4赞 interjay 7/7/2022 #1

假设介于 和 对于某些 .i2^n2^(n+1)n

然后是介于 和 之间。它作为双精度浮点的表示是 ,其中有 52 个 x。在该幅度下可以表示的最小差异是 。1/i2^(-n-1)2^-n1.xxx...xxx * 2^(-n-1)2^-52 * 2^(-n-1) = 2^(-n-53)

1/i如果它们之间的差值最多是 ,则可能会四舍五入到相同的数字。求解 : ==> .解决方案约为 。这与我们的 if 范围相匹配。然后。1/(i+1)2^(-n-53)i1/i - 1/(i+1) = 2^(-n-53)i(i+1) = 2^(n+53)i = 2^((n+53) / 2)in = 52i = 2^52.5

从这个值开始,有可能得到 和 的相同值。但这不会发生在每个人身上,因为这取决于数字的四舍五入方式。我们可以在那个时候开始搜索,正如你在那之后不久发现的那样,我们会找到第一个出现。i1/i1/(i+1)i

注意:我们还需要排除 n=51,因为它似乎有落在范围内的解决方案。但是,唯一介于 2^51 到 2^52 范围内且至少是上面计算的最小值的整数是 2^52 本身,可以排除。对于较大的值,我们需要切换到 n=52,如上所述。i

评论

0赞 Kelly Bundy 7/7/2022
当 n=52 时,它与 i 的范围匹配,但我认为它也与 n=51 和 n=53 匹配,不是吗?后者太大了,没什么意思,但是 n=51 呢?
0赞 interjay 7/7/2022
@KellyBundy 代入 n=51 得到最小 i 为 2^52,它不介于 2^n 和 2^(n+1) 之间。
0赞 Kelly Bundy 7/7/2022
但它确实如此。2^52 确实属于 2^51 和 2^52。特别是因为“大约”实际上意味着它略小于 2^52,所以即使你的意思是上限是排他性的,它也在这个范围内。
0赞 interjay 7/7/2022
@KellyBundy 它仅略低于 2^52 的 1。所以第一个相关的整数是 2^52,这是一个可以快速排除的单边情况。任何较大的整数都不会落在该范围内,因此我们需要切换到 n=52。
0赞 Kelly Bundy 7/7/2022
好吧,是的,这填补了这个漏洞。你能在答案中提到它吗?