R中浮点精度的极值数值

All*_*t86 10 floating-point precision r rounding ieee-754

有人可以解释一下以下输出.我知道它与浮点精度有关,但是magnitue(差异1e308)的顺序让我感到惊讶.

0:精度高

> 1e-324==0
[1] TRUE
> 1e-323==0
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

1:非常不高兴

> 1 - 1e-16 == 1
[1] FALSE
> 1 - 1e-17 == 1
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

Pas*_*uoq 14

R使用IEEE 754双精度浮点数.

浮点数在零附近更密集.这是因为它们被设计为在很宽的范围内准确计算(相当于大约16位有效十进制数,正如您所注意到的).

也许你期望一个具有统一绝对精度的定点系统.在实践中,定点要么是浪费,要么必须事先仔细估计每个中间计算的范围,如果它们是错误的话会产生严重后果.

正浮点数看起来像这样,示意:

+-+-+-+--+--+--+----+----+----+--------+--------+--------+--
0

最小正正常双精度数是最小指数幂的2.接近一,双精度浮点数已经相当广泛地分布.从一个到下面的数字有2到53的距离,从一个到它上面的数字的距离为2到52.

  • 虽然我们很挑剔,但“近 16 位数字”比“近 17 位数字”更准确。(2^53 大约等于 10^15.95)。 (2认同)

smc*_*mci 9

根据@ PascalCuoq的回答,因为IEEE 754兼容平台(例如x86)上的R double的FP精度不是十六位十进制数:

# 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
Run Code Online (Sandbox Code Playgroud)

因此1 - 1e-16已经非常接近ULP,并且1 - 1e-17超出了ULP,并且已经四舍五入到FP 1.0

请参阅.Machine的R文档:"机器的数字特征".特别要看看EPS和ULP之间的区别.

(ULP由FP编号1定义.FP编号越大,最后一位的值越大,舍入操作越粗糙)

至于数量1e-323来自何处:你将ULP与最小可表示的FP值混淆,后者远小于此值.

根据IEEE 754双精度示例,最小可表示的归一化正FP值具有指数e-308 ...

# 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...
Run Code Online (Sandbox Code Playgroud)

但是如果我们使用非标准化的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...
Run Code Online (Sandbox Code Playgroud)

(为什么我们不能凭经验发现它?因为IEEE-754在四舍五入之前内部带有一些保护数字)

(还要注意,表示表示是基2的参数:.Machine$double.base = 2)

  • 致反对者和所有人:如果有任何问题,请实际发表评论。我为此付出了一些努力。 (2认同)