我正在尝试在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
似乎由于某种原因,即使单精度和 double 的eps值正确,使用
nextafter
函数的输出也仅输出 double 值。我的epsxf
值应为6.1035e-05,就像在Matlab中一样。有什么想法吗?
最佳答案
包括<cmath>
并调用std::nextafter
,只要您具有C++ 11编译器,您的代码就可以使用。
包括<math.h>
和调用::nextafter
会调用该函数的C版本。 nextafter
的C实现显然不支持重载,因此C为单精度结果提供了nextafterf
,为四精度提供了nextafterl
。 (仅使用nextafter
调用 double float
失败,因为参数已转换为double
。)如果没有C++ 11编译器,则可以通过调用::nextafterf
来修复代码。
关于c++ - 在C++中实现Matlab的eps(x)函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20169049/