【问题标题】:R getting very small number instead of zeroR得到非常小的数字而不是零
【发布时间】:2020-12-09 05:22:15
【问题描述】:

在下面的代码中,如果 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。

【问题讨论】:

  • 是精度。您可以设置options(scipen = 999)

标签: r arithmetic-expressions


【解决方案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) &lt; 1e-10 的操作。

【讨论】:

  • 非常感谢您的彻底和有益的回应。我试过options(scipen = 999),但数字仍然没有显示为零。我会尝试四舍五入。
猜你喜欢
  • 2020-02-27
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多