【发布时间】:2019-10-20 19:18:25
【问题描述】:
我正在向我的女儿展示 R 中两个 111..111 数字乘法的神奇模式,例如
> options(scipen=999)
> 1^2
[1] 1
> 11^2
[1] 121
> 111^2
[1] 12321
> 1111^2
[1] 1234321
> 11111^2
[1] 123454321
> 111111^2
[1] 12345654321
> 1111111^2
[1] 1234567654321
> 11111111^2
[1] 123456787654321
> 111111111^2
[1] 12345678987654320
在达到 9 位数之前,一切都运行良好。从最后一行可以看出,答案显然是错误的;它应该是 1234567898765432*1*,而不是 1234567898765432*0*。
我在 Macbook Pro 笔记本电脑上的 R(v3.6.1,x86_64-apple-darwin15.6.0,64 位)中运行它。
有人说可能是整数溢出造成的。这里有两个问题:
谁能解释一下这到底是怎么发生的?例如最后的1怎么变成0了?
如何在 R 中得到正确答案?
谢谢。
【问题讨论】:
-
尝试使用
bit64包来表示大整数:cran.r-project.org/web/packages/bit64/index.html -
你必须做
bit64::as.integer64('111111111') * bit64::as.integer64('111111111'),不过;^.integer64强制加倍 -
或 gmp:
gmp::as.bigz('111111111')^2。相关:stackoverflow.com/questions/2053397/… -
感谢@alistaire 提供了获得正确答案的解决方案。谁能解释一下在正常 R 中最后一个 1 是如何变为 0 的?
-
如果你在结果上调用
str,即使你从整数str(111111111L^2L)开始,你也会得到一个double,所以这是浮点错误。如果你使用乘法而不是整数111111111L * 111111111L的幂,你会得到整数溢出,这是一个警告;它返回NA。
标签: r integer-overflow