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



Background

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

等价地,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

问题

Java(以及像Clojure这样的JVM语言(中是否有等效的功能?

引用

  • [1] http://www.mathworks.com/help/matlab/ref/eps.html
  • [2] https://github.com/numpy/numpy/blob/master/numpy/core/code_generators/ufunc_docstrings.py#L2905 的文档。
    • C 语言中的实际函数实现似乎 https://github.com/numpy/numpy/blob/master/numpy/core/src/npymath/ieee754.c.src#L323(npy_nextafter之前的许可证横幅让我的问题有些讽刺(。

你想要java.lang.math.ulp:

返回参数的 ulp 的大小。double值的 ulp 是此浮点值与 double值在数量级上下一个更大。请注意,对于非 NaN x, ulp(-x) == ulp(x)

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

最新更新