5

是否R存储最小的可能表示的科学价值?

澄清一下:在我目前的机器上:

>1e-300
[1] 1e-300

尽管

>1e-400
[1] 0

通过反复试验,我知道它e-324在我机器上的某个标记附近(它也开始失去精度)。

>1e-324
[1] 0
>5e-324
[1] 4.940656e-324

我已经搜索了.Machine列表,它存储的值都不包含我要查找的值或指数。

编辑:

侧面的链接线程表明这应该是.Machine$double.eps,这是2.220446e-16。显然情况不再如此?

4

2 回答 2

6

最小的归一化是double.xmin,如本页所述。Wikipedia条目非常有趣,并且具有低于正常值的限制,即,2^-1074大约是4.9406564584124654 x 10^-324(来自 Wikipedia,如 Ben Bolker 在评论中提到的)。您在 R 中的输出与此值匹配。

double.epsilon不是你想的那样。它是您可以加到 1 的最小数字,例如您获得的数字不会被识别为 1。

我建议您阅读有关双精度如何存储在内存中以及双精度操作的基础知识。一旦您了解了双精度数的存储方式,下限就很明显了。

于 2013-11-05T00:36:23.833 回答
1

接受的答案对于 base 仍然是正确的R,但使用包Rmpfr可以实现任意精度。例子:

首先,注意 base 中的问题R

> p <- c("5e-600","2e-324","3e-324","4e-324", "5e-324","6e-324","7.1e-324","8e-324")
> as.numeric(p)
[1]  0.000000e+00  0.000000e+00 4.940656e-324 4.940656e-324 4.940656e-324 4.940656e-324
[7] 4.940656e-324 9.881313e-324

请注意,当我们接近极限时,精度是一个问题,所有值都是4.940656e-324.

现在使用mpfr“Rmpfr”包中的函数将字符串转换为浮点数:

> library(Rmpfr)
> .N <- function(.) mpfr(., precBits = 20)
> .N(p)
8 'mpfr' numbers of precision  20   bits 
[1] 5.0000007e-600   2.00000e-324 2.9999979e-324   4.00000e-324 4.9999966e-324 5.9999959e-324
[7]   7.09999e-324   8.00000e-324
于 2017-10-25T23:58:39.870 回答