【问题标题】:#R how R compares numbers?#R R 如何比较数字?
【发布时间】:2022-01-27 03:31:40
【问题描述】:

代码如下:

2.9999999999999948933990 > 2.999999999999994893399
[1] TRUE
"20" > 2.999999999999994893399
[1] TRUE
"20" > 2.9999999999999948933990
[1] FALSE
"200" > 2.999999999999994893399
[1] TRUE
"200" > 2.9999999999999948933990
[1] FALSE
"20" > "200"
[1] FALSE
"20" < "200"
[1] TRUE

我的心刚刚好。谁能解释为什么添加 0 很重要?另外,“20”和“200”究竟等于哪个数字?

【问题讨论】:

  • 通过字符串比较来比较字符串。字典中哪个排在第一位,“ba”还是“baa”?
  • 我认为这是一种让许多 R 用户——甚至是经验丰富的用户——感到困惑的情况,我认为给出的例子是一个很好的例子。我不介意对观察到的行为进行更全面的解释。

标签: r algorithm


【解决方案1】:

根据help("Comparison"),如果将数值与字符串进行比较,则会将其转换为字符串(用于比较)。由于accuracy of floating point numbers添加了0事项。

help("as.character") 中记录了

as.character 表示实数和复数到 15 位有效 数字

现在比较一下:

sprintf("%.16f", 2.999999999999994893399)
#[1] "2.9999999999999947"
sprintf("%.16f", 2.9999999999999948933990)
#[1] "2.9999999999999951"

as.character(2.999999999999994893399)
#[1] "2.99999999999999"
as.character(2.9999999999999948933990)
#[1] "3"

【讨论】:

    【解决方案2】:

    部分问题是 2.999999999999994893399 和 2.9999999999999948933990 没有被解析为相同的数字。其原因可能是 R 使用的解析算法。我相信它是这样的:

    当您看到一个包含小数点的数字时,忽略小数并将该数字读取为整数,然后除以 10 的适当幂。

    所以 2.999999999999994893399 读作 2999999999999994893399 除以 10^21。但是 2999999999999994893399 太大而无法准确表示,所以读取后变为 2999999999999994757120,除法后变为 2.99999999999999946709(因为 10^21 也无法准确存储)。

    另一方面,2.9999999999999948933990 被读取为 29999999999999948933990 并除以 10^22。舍入不同,因为数字大了 10 倍:整数变为 29999999999999949668352,除法后为 2.999999999999995115。

    我显示的一些数字在您的系统上可能会有所不同:其中大部分是在非常低的级别处理的,并且可能会因系统库和硬件而有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多