我试图获得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)?
答案 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可能会为缺失留出一些值。