有人能解释一下以下的输出吗?我知道它与浮点精度有关,但数量级(1e308的差异)让我感到惊讶。
0:高精度
> 1e-324==0
[1] TRUE
> 1e-323==0
[1] FALSE
1: 非常不精确
> 1 - 1e-16 == 1
[1] FALSE
> 1 - 1e-17 == 1
[1] TRUE
有人能解释一下以下的输出吗?我知道它与浮点精度有关,但数量级(1e308的差异)让我感到惊讶。
0:高精度
> 1e-324==0
[1] TRUE
> 1e-323==0
[1] FALSE
1: 非常不精确
> 1 - 1e-16 == 1
[1] FALSE
> 1 - 1e-17 == 1
[1] TRUE
R使用IEEE 754双精度浮点数。
浮点数在靠近零时更密集。这是因为它们被设计为能够在非常宽的范围内准确计算(相当于大约16个有效数字),如您所注意到的。
也许您期望一个具有均匀绝对精度的定点系统。实际上,定点要么浪费空间,要么必须事先仔细估计每个中间计算的范围,如果估计错误会产生严重后果。
正浮点数的示意图如下:
+-+-+-+--+--+--+----+----+----+--------+--------+--------+-- 0
最小正常双精度数是2的最小指数次幂。接近1时,双精度浮点数已经相当分散。从1到其下一个数的距离是2的-53次方,而从1到其上一个数的距离是2的-52次方。
1-1e-17
将与1
不同。 - Patricia Shanahan# Machine ULP in decimal digits...
.Machine$double.ulp.digits * log10(2)
-15.65...
# Note the direct relationship between ULP digits and EPS:
.Machine$double.ulp.digits = -52
2.22 e-16 = .Machine$double.eps == 2^.Machine$double.ulp.digits
1-1e-16
已经非常接近ULP了,而1-1e-17
超出了ULP,并被舍入为浮点数1.0。# Minimum-representable normalized positive FP value is...
.Machine$double.xmin
2.225..e-308
# ...which would correspond to this base-2 exponent...
log10(.Machine$double.xmin) / log10(2)
-1022
# ...or this base-10 exponent...
.Machine$double.min.exp * log10(2)
-307.65...
如果使用未标准化的浮点数,即所有前导尾数位都为0,我们可以得到稍微更小的值。因此,正如您从经验上发现的那样,最小可表示的未标准化正浮点值在1e-324和1e-323之间。这是因为我们有52个尾数位,因此LSB的数值是2^51或10^15.35倍较小:
# Exponent of Minimum-representable UNnormalized positive FP value
log10(.Machine$double.xmin) - (.Machine$double.digits * log10(2))
-323.607...
.Machine$double.base = 2
。
options(digits = 22); x <- 1 - 1e-16; y <- 1 - 1e-17 == 1; print(y); print(x)
。 - Robert Krzyzanowski.Machine$ulp,eps,min.exp,xmin
。(1 - 1e-17 == 1) == TRUE
是一个更清晰、更简单的例子。 - smci