首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中实现Matlab的eps(x)函数

问在C++中实现Matlab的eps(x)函数
EN

Stack Overflow用户
提问于 2013-11-23 23:09:12
回答 2查看 2.6K关注 0票数 7

我试图在eps(x)中实现Matlab的C++函数

例如,在Matlab中:

代码语言:javascript
复制
>> eps(587.3888)
ans = 1.1369e-13
>> eps(single(587.3888))
ans = 6.1035e-05

然而,当我尝试在C++中这样做时,我无法得到正确的单一精确答案。

代码语言:javascript
复制
#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);

}

运行该程序,我得到以下输出:

代码语言:javascript
复制
$ ./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中一样。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-23 23:13:17

包括<cmath>和调用std::nextafter,只要您有C++11编译器,您的代码就能工作。

包括<math.h>和调用::nextafter调用函数的C版本。nextafter的C实现显然不支持过载,因此C为单精度结果提供了nextafterf,为四精度提供了nextafterl。(简单地用float调用双精度float失败,因为参数被转换为double。)如果没有C++11编译器,则可以通过调用::nextafterf来修复代码。

票数 8
EN

Stack Overflow用户

发布于 2013-11-23 23:16:11

使用图书馆。在其他语言中,Matlab的eps函数称为ULP,作为最后的单元。根据维基百科关于ULP的文章,boost C++库的以下函数可用于计算两个双a和b之间的浮点距离

代码语言:javascript
复制
boost::math::float_distance(a, b)

float_distance的文档是这里。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20169049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档