R语言rep函数为何在特定输入下生成长度异常的向量?
R中rep函数长度计算异常的原因分析
这是典型的浮点数精度误差导致的问题,具体拆解如下:
二进制浮点数的局限性
计算机以二进制存储小数,像0.05这类十进制小数无法被二进制精确表示,只能存储近似值。每次对这类近似值进行运算,都会引入微小误差。多次减法的误差累积
执行p=1-0.05-0.05-0.05时,每一步减法都会叠加之前的近似误差,最终得到的p并非精确的0.85,而是一个略小于0.85的数值(比如用print(p, digits=20)可查看为0.84999999999999991118)。rep函数的取整规则
rep(0, n)中若n为小数,R会自动对其向下取整(等价于floor(n))。当p*a的结果略小于85时,向下取整后就得到84。先求和再减法的误差抵消
执行p=1-(0.05+0.05+0.05)时,三次0.05的近似值相加后,再用1减去这个和,最终的误差方向刚好让结果略大于0.85(比如0.85000000000000008882),乘以100后略大于85,向下取整仍为85,因此得到预期结果。
你可以通过以下代码验证误差细节:
# 定义不同方式计算的p值 p_direct <- 0.85 p_subtract <- 1-0.05-0.05-0.05 p_sum_subtract <- 1-(0.05+0.05+0.05) # 查看高精度下的数值 print(p_subtract, digits=20) print(p_sum_subtract, digits=20) # 计算p*100的结果 p_subtract * 100 p_sum_subtract * 100 # 查看向下取整结果 floor(p_subtract * 100) floor(p_sum_subtract * 100)
内容的提问来源于stack exchange,提问作者Nimish Adhikari
相关产品推荐
相关产品推荐

