Precision and realmax
I was on a recent email thread at the office regarding realmax, eps, and overflow.
Contents
What is realmax?
From the help for realmax we learn that
h = help('realmax');
disp(h(1:48))REALMAX Largest positive floating point number.
Here's the double precision value for realmax shown with about 15 digits.
format long
rmax = realmax
rmax =
1.797693134862316e+308
Overflow with Respect to realmax
Let's see what it takes to add to realmax to get to the next number.
epsrmax = eps(rmax) big = rmax+epsrmax
epsrmax =
1.995840309534720e+292
big =
Inf
Are you surprised that the next largest number is Inf?
How about Less than eps?
What if we try a number a tenth of eps?
biggish = rmax + epsrmax/10 isequal(biggish, rmax)
biggish =
1.797693134862316e+308
ans =
1
It's not far enough away on the floating point scale to produce a value different from rmax. In fact, the help for eps has a list of values for eps at some interesting double and single values.
help eps EPS Spacing of floating point numbers.
D = EPS(X), is the positive distance from ABS(X) to the next larger in
magnitude floating point number of the same precision as X.
X may be either double precision or single precision.
For all X, EPS(X) is equal to EPS(ABS(X)).
EPS, with no arguments, is the distance from 1.0 to the next larger double
precision number, that is EPS with no arguments returns 2^(-52).
EPS('double') is the same as EPS, or EPS(1.0).
EPS('single') is the same as EPS(single(1.0)), or single(2^-23).
Except for numbers whose absolute value is smaller than REALMIN,
if 2^E <= ABS(X) < 2^(E+1), then
EPS(X) returns 2^(E-23) if ISA(X,'single')
EPS(X) returns 2^(E-52) if ISA(X,'double')
For all X of class double such that ABS(X) <= REALMIN, EPS(X)
returns 2^(-1074). Similarly, for all X of class single such that
ABS(X) <= REALMIN('single'), EPS(X) returns 2^(-149).
Replace expressions of the form
if Y < EPS * ABS(X)
with
if Y < EPS(X)
Example return values from calling EPS with various inputs are
presented in the table below:
Expression Return Value
===========================================
eps(1/2) 2^(-53)
eps(1) 2^(-52)
eps(2) 2^(-51)
eps(realmax) 2^971
eps(0) 2^(-1074)
eps(realmin/2) 2^(-1074)
eps(realmin/16) 2^(-1074)
eps(Inf) NaN
eps(NaN) NaN
-------------------------------------------
eps(single(1/2)) 2^(-24)
eps(single(1)) 2^(-23)
eps(single(2)) 2^(-22)
eps(realmax('single')) 2^104
eps(single(0)) 2^(-149)
eps(realmin('single')/2) 2^(-149)
eps(realmin('single')/16) 2^(-149)
eps(single(Inf)) single(NaN)
eps(single(NaN)) single(NaN)
See also REALMAX, REALMIN.
Overloaded methods:
codistributed/eps
quantizer/eps
qfft/eps
Reference page in Help browser
doc eps
References
Here are some references to help you learn more about floating point issues.
Do Floating Point Issues Haunt You?
Do you recognize when issues you have are from floating point considerations? Do you have any war stories or best practices to share with others? Post them here.
- Category:
- Common Errors,
- Puzzles


Comments
To leave a comment, please click here to sign in to your MathWorks Account or create a new one.