如何调整整数的数值精度
How to adjust the numerical precision for integers
我正在尝试在 R 中使用大数字,在我看来它们甚至没有那么大。我让 R return 我将 6001532020609003100 除以 97 的模块,我得到了答案 1;在 Python 中进行相同的计算时,我得到了答案 66。
谁能告诉我这是怎么回事?
library(Rmpfr)
as.integer(mpfr("6001532020609003100") %% 97)
[1] 66
R 没有 Python 那种“神奇”的任意长度整数:它的基本整数类型是 32 位,最大为 .Machine$integer.max
== 2147483647 . 当遇到大于这个值的数字时,R 自动将其转换为双精度浮点数;然后 %%
运算符被浮点不精确弄乱了。 (如果你试图通过输入 6001532020609003100L
来坚持输入是整数(L
表示整数)R 仍然会将其转换为浮点数,但会警告你...)
@JonSpring 是正确的,您可以使用 Rmpfr
进行完全任意长度的整数计算(取决于您计算机的内存容量),但您可以
还使用 bit64
包来表示 64 位整数,您的示例 just 适合:
library(bit64)
x <- as.integer64("6001532020609003100")
x %% 97
## [1] 66
但是将此值加倍会使您超出整数 64 范围:2*x
会产生溢出错误。
老实说,如果你想做很多大整数计算,我会说 Python 更方便......
我正在尝试在 R 中使用大数字,在我看来它们甚至没有那么大。我让 R return 我将 6001532020609003100 除以 97 的模块,我得到了答案 1;在 Python 中进行相同的计算时,我得到了答案 66。
谁能告诉我这是怎么回事?
library(Rmpfr)
as.integer(mpfr("6001532020609003100") %% 97)
[1] 66
R 没有 Python 那种“神奇”的任意长度整数:它的基本整数类型是 32 位,最大为 .Machine$integer.max
== 2147483647 . 当遇到大于这个值的数字时,R 自动将其转换为双精度浮点数;然后 %%
运算符被浮点不精确弄乱了。 (如果你试图通过输入 6001532020609003100L
来坚持输入是整数(L
表示整数)R 仍然会将其转换为浮点数,但会警告你...)
@JonSpring 是正确的,您可以使用 Rmpfr
进行完全任意长度的整数计算(取决于您计算机的内存容量),但您可以
还使用 bit64
包来表示 64 位整数,您的示例 just 适合:
library(bit64)
x <- as.integer64("6001532020609003100")
x %% 97
## [1] 66
但是将此值加倍会使您超出整数 64 范围:2*x
会产生溢出错误。
老实说,如果你想做很多大整数计算,我会说 Python 更方便......