Java相当于Matlab的`eps`或Numpy/Python的`spacing`函数(浮点相对精度)

Ahm*_*sih 5 python java floating-point matlab floating-accuracy

背景

Matlab的内置eps函数[1]可以取一个数值X并返回"从abs(X)相同精度的大小浮点数中的下一个更大的正距离".

>> eps(1)
ans =
   2.2204e-16
>> eps(single(1))
ans =
   1.1921e-07
>> eps(1e6)
ans =
   1.1642e-10
>> eps(single(1e6))
ans =
       0.0625
Run Code Online (Sandbox Code Playgroud)

同样,Numpy提供了spacing函数[2]:

In [18]: import numpy as np

In [19]: np.spacing(1)
Out[19]: 2.2204460492503131e-16

In [20]: np.spacing(np.single(1))
Out[20]: 1.1920929e-07

In [21]: np.spacing(1e6)
Out[21]: 1.1641532182693481e-10

In [22]: np.spacing(np.single(1e6))
Out[22]: 0.0625
Run Code Online (Sandbox Code Playgroud)

Java中是否存在等效函数(因此像Clojure这样的JVM语言)?

参考

hor*_*ler 3

你想要java.lang.math.ulp

返回参数 ulp 的大小。值的 ulpdouble是该浮点值与 double下一个较大值之间的正距离。请注意,对于非 NaN x, ulp(-x) == ulp(x)

此外,还可用于浮标ULP 的一些背景。