【问题标题】:Numerical issues in R [closed]R中的数值问题[关闭]
【发布时间】:2023-03-26 00:45:01
【问题描述】:

众所周知,在比较两个实数时,最好使用较小的容差以避免出现数值问题。

我正在寻找一个示例,当我们比较具有d 小数位数的数字x 时,以下表达式返回FALSE

round(x, d) == x

例如,如果 x=0.1234d=4。但是,这不是一个很好的示例,因为当您评估 round(x, d) == x 时会返回 TRUE。我正在寻找x 的值,其中round(x, d) == x 变为FALSE

【问题讨论】:

  • 不确定您的意思。 round(1.1234, 2) == 1.1234 返回FALSE
  • @Ronak 我在 R 代码中看到它使用 abs(x - round(x, d)) < eps。所以想想x == round(x, d) 会失败的情况。
  • @RonakShah 他/她的意思是round(x,d),其中d 是点后的位数。 round(1.1234, d) == 1.1234d=4 返回 TRUE
  • @RonakShah 只有当你输入一个不能精确表示的数字(很难做到)或者你计算出这样一个数字(相当容易)时,它才会失败。
  • @RonakShah 在您的回答中,最后一次迭代变为FALSE。因此,x == round(x, d) 失败的情况很少见。

标签: r floating-point comparison-operators


【解决方案1】:

尚不清楚您如何定义d。这里我假设它是基于精确代数定义的。

for (i in 1:20) print(1/(8 * 10^i) == round(1/(8 * 10^i), 3 + i))
sprintf("%.50f", 1/8e20)
#[1] "0.00000000000000000000124999999999999993158684291616"

【讨论】:

  • 谢谢。这就是我一直在寻找的。这种比较失败的案例。
猜你喜欢
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2017-09-05
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多