在最后一个值列表上有奇怪的输出

时间:2011-09-12 16:05:51

标签: r

我正在遍历包含4个列表的列表。下面是我得到的输出,我想知道为什么我得到这个准确性,例如,为什么不是第一个只有1.00,因为在其他情况下?

[[1]]
 [1] 1.00 0.96 0.84 0.74 0.66 0.56 0.48 0.36 0.26 0.16 0.06 0.00

[[2]]
 [1] 1.00 0.98 0.84 0.74 0.66 0.56 0.48 0.38 0.26 0.16 0.06 0.00

[[3]]
 [1] 1.00 0.94 0.84 0.74 0.66 0.56 0.48 0.36 0.26 0.16 0.06 0.00

[[4]]
 [1] 1.000000e+00 9.400000e-01 8.400000e-01 7.400000e-01 6.600000e-01 5.800000e-01 4.600000e-01 3.600000e-01 2.600000e-01 1.600000e-01 6.000000e-02 1.110223e-16

3 个答案:

答案 0 :(得分:2)

正如我在您第一次将其作为对上一个问题的后续评论发布时评论的那样,这更像是一个显示问题。最后一个数字实际为零:

R> identical(0, 1.1e-16)
[1] FALSE
R> all.equal(0, 1.1e-16)
[1] TRUE
R> 

虽然它的二进制表示不是零,但它在大多数情况下评估的值足够接近。因此,您可以对数据运行过滤器并替换“近零”'零,或者你可以调试代码,看看它是如何/为什么它出来的非零。

另请参阅R FAQ和有关浮点计算相关问题的一般参考。

答案 1 :(得分:1)

如果要将浮点数显示四舍五入到第二个十进制数字,请使用:

lapply( mylist, round, digits=2)

这种方法的优点是它返回了一个format()调用不会返回的数值模式值,它也可以用于“长”的数字规范,并且可以是一个有效的“零过滤器”:

lapply(list(c(1,2), c(1.000000e+00, 9.400000e-01, 6.000000e-02, 1.110223e-16 )), round, 

digits=13)
[[1]]
[1] 1 2

[[2]]
[1] 1.00 0.94 0.06 0.00

答案 2 :(得分:0)

我不确定R用于选择格式的确切算法。很明显,单个格式用于每个列表中的所有值。同样清楚的是,最后一个列表包含大不相同的数量级的值:1.000000e+001.110223e-16。因此,我认为R选择使用科学记数法打印最后一个列表是合理的。