大整数转换值异常:为何as.bigz传入数字会失真?
R语言gmp包处理超大整数的数值误差原因解析
问题现象
处理超大整数10295419305791578917358173519057891283897623986时,直接以数值形式传入as.bigz()会得到错误结果:
library(gmp) as.bigz(10295419305791578917358173519057891283897623986)
输出:
Big Integer ('bigz') : [1] 10295419305791579051260295299235939155628261376
但以字符串形式传入则能得到准确结果:
as.bigz("10295419305791578917358173519057891283897623986")
输出:
Big Integer ('bigz') : [1] 10295419305791578917358173519057891283897623986
原因解释
- 这是R基础数值类型的精度限制导致的:R默认使用64位双精度浮点数存储数值,这种类型只能精确表示小于等于253(约9×1015)的整数。你的输入整数位数超过16位,远大于这个阈值,所以当你直接写裸数值时,R会先将其转换为双精度浮点数,这一步已经丢失了部分精度,后续传给
as.bigz()得到的自然是失真后的数值。 - 以字符串形式传入时,
as.bigz()会直接解析字符串中的数字字符,完全绕过了R基础数值类型的精度限制,因此能准确生成对应的大整数对象。
内容的提问来源于stack exchange,提问作者Jovan
相关产品推荐
相关产品推荐

