我試圖實現Matlab的eps(x)
功能在C++實現Matlab的EPS(x)函數++
例如,在Matlab:
>> eps(587.3888)
ans = 1.1369e-13
>> eps(single(587.3888))
ans = 6.1035e-05
然而,當我嘗試做這在C++我無法得到正確的單精度答案。
#include <limits>
#include <iostream>
#include <math.h>
#define DEBUG(x) do { std::cerr << x << std::endl; } while (0)
#define DEBUG2(x) do { std::cerr << #x << ": " << x << std::endl; } while (0)
int main() {
float epsf = std::numeric_limits<float>::epsilon();
DEBUG2(epsf);
double epsd = std::numeric_limits<double>::epsilon();
DEBUG2(epsd);
float espxf = nextafter(float(587.3888), epsf) - float(587.3888);
double espxd = nextafter(double(587.3888), epsd) - double(587.3888);
DEBUG2(espxf);
DEBUG2(espxd);
}
運行該程序將得到以下的輸出:
$ ./a.out
epsf: 1.19209e-07
epsd: 2.22045e-16
espxf: -1.13687e-13
espxd: -1.13687e-13
它好像出於某種原因,即使單精度和雙精度的EPS值是正確的,使用輸出nextafter
功能只輸出雙精度值。我在epsxf
的值應該是6.1035e-05,因爲它在Matlab中。
有什麼想法?
MATLAB的'eps'總是給出肯定的結果。如果'x'大於'epsf',上面的代碼會給出否定的結果。 [這裏](http://coliru.stacked-crooked.com/a/68546c8c401c0610)是固定代碼:'double eps(float x){float xp = std :: abs(x); double x1 = std :: nextafter(xp,xp + 1.0f);返回x1 - xp; }' – legends2k