R最大/最小可表示数字

时间:2016-07-02 23:11:21

标签: r data-representation

我试图获得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)?

2 个答案:

答案 0 :(得分:9)

.Machine$double.xmin给出最小正数的值,其表示符合IEEE 754 technical standard对浮点计算的要求。正如Wikipedia article中关于双精度浮点数所述,该标准要求:

  

如果具有最多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

答案 1 :(得分: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可能会为缺失留出一些值。