In MATLAB, there is a function named 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)).
Is there an equivalent in Mathematica?
Edit:
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)
Log[2,$MachineEpsilon]==-52
$\endgroup$In[425]:= eps[x_Real] := (1 + $MachineEpsilon)*x - x In[430]:= Log2[Map[eps, {.2, .5, 1., 1.6, 2., 5.5}]] Out[430]= {-54., -53., -52., -51., -51., -50.}
$\endgroup$nextafter
to get something equivalent toeps
. $\endgroup$