R获得非常小的数字而不是零

时间:2020-08-19 21:55:33

标签: r arithmetic-expressions

在以下代码中,如果TrimCY = TrimBYS,则快照应为0。

df <- df %>% 
   mutate(snapshot = case_when(Trend_direction != 2 ~ (TrimCY-TrimBYS)*sign(Trend_direction)*10/abs(Target_Snap-TrimBYS), 
                               TRUE ~ 10-((abs(TrimCY-Target_Snap)*10)/abs(Target_Snap-TrimBYS))))

当我在下面显示的数据上执行此代码时,情况并非总是如此。查看快照值。

Trend_direction   Target_Snap   TrimCY   TrimBYS   snapshot 
1                 56            53       53        0.000000e+00 
1                 56            54       54        -3.552714e-14    
1                 56            55       55        -7.105427e-14    

有人知道我为什么得到这些很小的非零结果吗?当我将算术函数复制到控制台中并使用上述值执行时,它总是显示为0。

1 个答案:

答案 0 :(得分:1)

这些是浮点错误。要了解正在发生的事情的基本概念,请在一张纸上算出1 - 1/3 - 1/3 - 1/3 = ?,但只能用到小数点后3位。该方程式看起来像1 - 0.333 - 0.333 - 0.333 = 0.001。即使应为零,也不为零。计算机基本上是这样做的,但是要保留更多的小数位和二进制数。

要获得更详细的解释,周围有很多资源:例如:https://floating-point-gui.de/

您可以通过四舍五入答案或(如akrun建议的)设置选项来解决这些问题,以使这些数字显示为零。

这就是为什么最好不要在x受到这些浮点计算的影响时测试x == 0,而总是做类似abs(x) < 1e-10的事情。