1876年,Frank Nelson Cole显示Mersenne数M67 = 2 ^ 67 - 1不是素数。
在科尔所谓的“讲座”期间,他走近黑板并完全沉默地继续计算M67的值,结果是147,573,952,589,676,412,927。科尔然后转移到董事会的另一边,写了193,707,721×761,838,257,287,并通过手工繁琐的计算。在完成乘法并证明结果等于M67后,科尔回到了他的座位,在一小时的演讲中没有说出一句话。他的观众起立鼓掌地欢迎演讲。
我试图用R计算这个。但似乎有一个舍入错误。 (This answer解释了如何显示更多数字。)
print(2^67-1, digits =21)
# [1] 147573952589676412928
print(193707721 * 761838257287, digits = 21)
# [1] 147573952589676412928
print(147573952589676412927, digits = 21)
# [1] 147573952589676412928
有没有办法防止R在下一个整数处舍入?
答案 0 :(得分:2)
您已达到64位双精度浮点的限制。
IEEE754双精度浮点只能显示精确到第53次方的2的整数。此后它将舍入到最接近的可用整数。你可以通过考虑展示这个的第一个数字来自己看到这个:
9,007,199,254,740,993
是2 53 + 1,将作为9,007,199,254,740,992
您的号码147,573,952,589,676,412,927
表现相似,会与相邻的2 67
(你需要使用一个可以处理大整数的库。虽然Java中缺少运算符重载使得它可以使用,但Java有一个很好的库。许多C ++编译器都有128位整数类型,这样就足够了对于这个。我认为即使R有一个大量的图书馆 - Brobdingnag? - 在Jonathan Swift" Gulliver's Travels"中的一个岛屿之后,有点自命不凡地命名。)