Как получить правильный ответ для 111111111 * 111111111 в R? - PullRequest
5 голосов
/ 20 октября 2019

Я показывал своей дочери магический шаблон умножения двух чисел 111..111 в R, например,

> 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 *.

Я запускаю это в R (v3.6.1, x86_64-apple-darwin15.6.0, 64-разрядная версия) на ноутбуке Macbook Pro.

Кто-то сказал, что это может быть вызвано целочисленным переполнением. Здесь два вопроса:

  1. Кто-нибудь может объяснить, как именно это произошло? например, как последний 1 изменился на 0?

  2. Как я могу получить правильный ответ в R?

Спасибо.

1 Ответ

2 голосов
/ 20 октября 2019

Мой личный фаворит для такого рода проблем - пакет Rmpfr, пакет R для библиотеки GNU MPFR .

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...