R largest/smallest representable numbers

a 夏天 提交于 2021-02-18 09:56:05

问题


I'm trying to get the largest/smallest representable number in R.

After typing ".Machine"

I got:

$double.xmin
[1] 2.225074e-308

$double.xmax
[1] 1.797693e+308

However even if I type 2.225074e-309 in R command prompt I get 2.225074e-309 instead of the expected 0

How can I find the largest/smallest number for which adding or subtracting 1 would lead to either Inf(Adding 1 to largest number) or 0(subtracting 1 from smallest number) ?


回答1:


.Machine$double.xmin gives the value of the smallest positive number whose representation meets the requirements of IEEE 754 technical standard for floating point computation. As is mentioned in the Wikipedia article on double-precision floating point numbers, that standard requires that:

If a decimal string with at most 15 significant digits is converted to IEEE 754 double precision representation and then converted back to a string with the same number of significant digits, then the final string should match the original. If an IEEE 754 double precision is converted to a decimal string with at least 17 significant digits and then converted back to double, then the final number must match the original.

The same article goes on to note that, by compromising precision, even smaller positive numbers (which do not meet the standards' precision requirements) can be represented:

The 11 bit width of the exponent allows the representation of numbers between 10-308 and 10308, with full 15–17 decimal digits precision. By compromising precision, the subnormal representation allows even smaller values up to about 5 × 10-324.

R's doubles behave in exactly this way, as is noted in the Details section of ?.Machine:

Note that on most platforms smaller positive values than ‘.Machine$double.xmin’ can occur. On a typical R platform the smallest positive double is about ‘5e-324’.

To confirm that that is the smallest positive value that can be represented using R's doubles and to see the cost in loss of precision, try out a few operations like this:

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



回答2:


Here are some representations using SAS, IEEE 754 Big Endian?

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

Biggest

7FEFFFFFFFFFFFFF 1.79769313486230E+308

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

Smallest

0010000000000000 2.22507385850720E-308

I am not sure the smallest because SAS may set aside some values for missings.



来源:https://stackoverflow.com/questions/38165221/r-largest-smallest-representable-numbers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!