【问题标题】:How to get the correct answer for 111111111 * 111111111 in R?如何在 R 中获得 111111111 * 111111111 的正确答案?
【发布时间】: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. 谁能解释一下这到底是怎么发生的?例如最后的1怎么变成0了?

  2. 如何在 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


【解决方案1】:

对于这类问题,我个人最喜欢的是包Rmpfr,这是GNU MPFR Library 的R 包。

library(Rmpfr)

## 53 bit precision
ones9 <- mpfr(1111111111, precBits = 53)

ones9^2
#1 'mpfr' number of precision  53   bits 
#[1] 1234567900987654400


## 100 bit precision
ones9b <- mpfr(1111111111, precBits = 100)
ones9b^2
#1 'mpfr' number of precision  100   bits 
#[1] 1234567900987654321

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 2018-08-27
    • 2022-01-22
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多