gpt4 book ai didi

r - 这两种比较有什么区别?

转载 作者:行者123 更新时间:2023-12-04 02:33:05 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




9年前关闭。




Possible Duplicate:
Why are these numbers not equal?


0.9 == 1-0.1 >>> TRUE
0.9 == 1.1-0.2 >>> FALSE

最佳答案

修复您的程序的答案:

> all.equal(0.9,1.1-0.2)
[1] TRUE
> all.equal(0.9, 1.1-0.3)
[1] "Mean relative difference: 0.1111111"
> isTRUE(all.equal(0.9, 1.1-0.3)
[1] FALSE

如果在代码中使用:
if(isTRUE(all.equal(0.9,1.1-0.2)) {
....
}

或在向量中:
> vec1=0.9
> vec2=c(1.1-0.2,1.3-0.4,1.0-0.2)
> mapply(function(...)isTRUE(all.equal(...)),vec1, vec2)
[1] TRUE TRUE FALSE

给理智的人回答:

我建议你阅读“ what every computer scientist should know about floating point numbers”。 ( or here )。

Richie 还指出 R faq mentions this问题。您真的应该阅读整个 R 常见问题解答。

对受虐狂的回答:

您遇到的问题是浮点数在大多数情况下无法准确表示小数,这意味着您会经常发现完全匹配失败。

而当你说的时候,R 有点说谎:
> 1.1-0.2
[1] 0.9
> 0.9
[1] 0.9

你可以用十进制找出它真正的想法:
> sprintf("%.54f",1.1-0.2)
[1] "0.900000000000000133226762955018784850835800170898437500"
> sprintf("%.54f",0.9)
[1] "0.900000000000000022204460492503130808472633361816406250"

您可以看到这些数字是不同的,但表示方式有点笨拙。如果我们以二进制(嗯,十六进制,等效)查看它们,我们会得到更清晰的图片:
> sprintf("%a",0.9)
[1] "0x1.ccccccccccccdp-1"
> sprintf("%a",1.1-0.2)
[1] "0x1.ccccccccccccep-1"
> sprintf("%a",1.1-0.2-0.9)
[1] "0x1p-53"

您可以看到它们的区别在于 2^-53 ,这很重要,因为该数字是值接近 1 的两个数字之间可表示的最小差值,原样。

我们可以通过查看 R 的机器字段来找出任何给定计算机的最小可表示数是多少:
 > ?.Machine
....
double.eps the smallest positive floating-point number x
such that 1 + x != 1. It equals base^ulp.digits if either
base is 2 or rounding is 0; otherwise, it is
(base^ulp.digits) / 2. Normally 2.220446e-16.
....
> .Machine$double.eps
[1] 2.220446e-16
> sprintf("%a",.Machine$double.eps)
[1] "0x1p-52"

您可以使用这个事实来创建一个“几乎等于”的函数,该函数检查差异是否接近浮点中的最小可表示数。事实上这已经存在(感谢评论者)。
> ?all.equal
....
all.equal(x,y) is a utility to compare R objects x and y testing ‘near equality’.
....
all.equal(target, current,
tolerance = .Machine$double.eps ^ 0.5,
scale = NULL, check.attributes = TRUE, ...)
....

> all.equal(0.9,1.1-0.2)
[1] TRUE

所以 all.equal 函数实际上是检查数字之间的差值是两个尾数之间最小差值的平方根。

这个算法在被称为非正规数的极小数附近有点有趣,但您不必担心这一点。

关于r - 这两种比较有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2227734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com