R语言64位双精度数值表示及0.1的精度问题技术问询
嘿,这其实是R里关于浮点数存储的一个经典问题,咱们把它掰扯明白:
哪些数值能在R里被精确表示?
根据R FAQ的说明,只有两类数值能被R精确存储:
- 整数
- 分母为2的幂的分数(比如0.5、0.25、0.125这类,因为它们的二进制是有限位的)
其他所有数值,都会被内部舍入到53位二进制精度来存储——这背后是因为R采用了IEEE 754双精度浮点数标准。
IEEE 754双精度浮点数的结构
这个标准把64位的存储空间拆成了三个部分:
- 1位符号位:用来标记数值是正还是负
- 11位指数位:控制数值的量级大小
- 52位尾数位(也叫有效数字位):再加上一个隐含的最高位1,总共提供了53位的二进制精度
用0.1来实际验证一下
你可以在R里跑这段代码:
sprintf("%.60f", 0.1)
得到的结果会是:
[1] "0.100000000000000005551115123125782702118158340454101562500000"
这是因为0.1的二进制表示是无限循环的,没办法用有限的53位二进制精确存储,所以只能用最接近的近似值代替——这就是为什么打印出来的结果会有一串看似多余的数字尾巴啦。
内容的提问来源于stack exchange,提问作者989
相关产品推荐
相关产品推荐

