我试图在 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)的最大/最小数字?
我试图在 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)的最大/最小数字?
.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
以下是一些使用 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 可能会留出一些缺失值。