c++ LINUX中的浮点异常--如何将它们转换成有用的东西

d6kp6zgx  于 2023-02-14  发布在  Linux
关注(0)|答案(1)|浏览(117)

我有一些代码计算一个向量的函数向量的自变量(和参数):

struct instance
{    double m_adParam1, m_adParam2;
     std::array<double, OUTSIZE> calculate(const std::array<double, INSIZE>&x) const;
};

当这段代码的任何部分由于被(几乎)零除或由于域错误而失败时,整个代码应该失败,并告诉调用者它不能为给定的输入计算这个函数。
这也适用于仅用于比较的计算值。因此,测试结果向量是否为NAN或无穷大是不够的。在每个易出错的操作后插入测试是不可行的。
怎么能这样呢?
我读过fetestexcept()。但是不清楚是什么重置了这个状态标志。SIGFPE除了调试之外对任何事情都没有用。能够像在Windows上那样将其转换为C++异常将是很好的,但是插入一个最终检查也足够了。
插入代码来检查以下代码的无效输入也是不可行的,因为这会显著降低计算速度。

ubof19bj

ubof19bj1#

我读过fetestexcept(),但不清楚是什么重置了这个状态标志。
这就是feclearexcept()所做的事情。所以你可以这样做

std::feclearexcept(FE_INVALID | FE_OVERFLOW | FE_DIVBYZERO);

// do lots of calculations

// now check for exceptions
if (std::fetestexcept(FE_INVALID))
    throw std::domain_error("argh");
else if (std::fetestexcept(FE_OVERFLOW))
    throw std::overflow_error("eek");
// ...

异常标志是“粘滞的”,除了显式的feclearexcept()之外,没有其他操作可以清除它们。
使用feenablexcept()强制执行SIGFPE的主要好处是,您可以立即检测到错误,而不必等到您碰巧抽出时间测试异常标志,并且您可以精确定位导致异常的确切指令。

相关问题