15

我试图在 R 中获得最大/最小的可表示数字。

输入“.Machine”后

我有:

$double.xmin
[1] 2.225074e-308

$double.xmax
[1] 1.797693e+308

但是,即使我在 R 命令提示符下键入 2.225074e-309 我得到 2.225074e-309 而不是预期的 0

如何找到加或减 1 会导致 Inf(最大数字加 1)或 0(最小数字减 1)的最大/最小数字?

4

2 回答 2

16

.Machine$double.xmin给出其表示符合IEEE 754浮点计算技术标准要求的最小正数的值. 正如维基百科关于双精度浮点数的文章中提到的那样,该标准要求:

如果将最多 15 位有效数字的十进制字符串转换为 IEEE 754 双精度表示,然后再转换回具有相同有效数字位数的字符串,则最终字符串应与原始字符串匹配。如果将 IEEE 754 双精度转换为具有至少 17 位有效数字的十进制字符串,然后再转换回双精度,则最终数字必须与原始数字匹配。

同一篇文章继续指出,通过牺牲精度,甚至可以表示更小的正数(不符合标准的精度要求):

指数的 11 位宽度允许表示 10 -308和 10 308之间的数字,具有完整的 15–17 十进制数字精度。通过牺牲精度,次正规表示允许更小的值,最大约为 5 × 10 -324

R 的双打正是以这种方式表现的,如以下的详细信息部分所述?.Machine

请注意,在大多数平台上,可能会出现比 '.Machine$double.xmin' 更小的正值。在典型的 R 平台上,最小的正双精度约为 '5e-324'。

要确认这是可以使用 R 的双精度数表示的最小正值并查看精度损失的成本,请尝试以下操作:

5e-324
# [1] 4.940656e-324
2e-324
# [1] 0
1.4 * 5e-324
# [1] 4.940656e-324
1.6 * 5e-324
# [1] 9.881313e-324
于 2016-07-03T00:14:30.367 回答
0

以下是一些使用 SAS、IEEE 754 Big Endian 的表示?

data _null_;
    y=constant('big');
    put y hex16.;
    put y E21.3;
run;quit;

最大

7FEFFFFFFFFFFFFF 1.79769313486230E+308

data _null_;
    y=constant('small');
    put y hex16.;
    put y E21.3;
run;quit;

最小的

0010000000000000 2.22507385850720E-308

我不确定最小的,因为 SAS 可能会留出一些缺失值。

于 2016-07-05T19:14:56.393 回答