可有人请解释一下我下面的输出。 我知道,它是与浮点精度,但magnitue(差1e308)的顺序让我惊讶。
0:高精度
> 1e-324==0
[1] TRUE
> 1e-323==0
[1] FALSE
1:非常unprecise
> 1 - 1e-16 == 1
[1] FALSE
> 1 - 1e-17 == 1
[1] TRUE
可有人请解释一下我下面的输出。 我知道,它是与浮点精度,但magnitue(差1e308)的顺序让我惊讶。
0:高精度
> 1e-324==0
[1] TRUE
> 1e-323==0
[1] FALSE
1:非常unprecise
> 1 - 1e-16 == 1
[1] FALSE
> 1 - 1e-17 == 1
[1] TRUE
R使用IEEE 754双精度浮点数。
浮点数字是接近零的更密集。 这是一个旨在准确计算(约16显著十进制数字相当于,因为你已经注意到)在很宽的范围内他们的存在的结果。
也许你希望用统一的绝对精度定点系统。 在实践中定点或者是浪费的或每个中间计算的范围必须事先仔细估计,具有严重的后果,如果他们是错误的。
正浮点数这个样子,示意:
+-+-+-+--+--+--+----+----+----+--------+--------+--------+-- 0
最小的正正常双精度数为2至最小指数的功率。 近一个,双精度浮点数已经流传颇广开。 有2 -53从一个距离范围,其下的数量,以及2 -52从一个到它上面的数的距离。
按@ PascalCuoq的答案,因为R双层的上一个符合IEEE 754平台的FP精度(例如86)是不太16个十进制数字:
# 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,并得到四舍五入到FP 1.0
请参阅R文件。机:“机器的数值特性” 。 在EPS和ULP之间的区别特定的外观。
(ULP是定义WRT的FP数目1.越大您的FP数目得到,最后位的值越大,越粗的舍入操作是)
至于在数量1E-323来自:你和最小表示的FP值,这是远远小于混淆ULP。
最小可表示的归一化正FP值具有指数e-308,按照IEEE 754双精度例子 ...
# 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...
但是,我们可以得到稍微小一点,如果我们使用一个非标准化FP数,即所有领先的尾数位是0。因此当你发现经验, 最小的可表示非标准化阳性FP值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...
(为什么我们不能确切地凭经验发现呢?因为IEEE-754内部四舍五入前载有一些护卫位数)
(还要注意,表示表示是基2的参数: .Machine$double.base = 2
)