我有一些代码计算一个向量的函数向量的自变量(和参数):
struct instance
{ double m_adParam1, m_adParam2;
std::array<double, OUTSIZE> calculate(const std::array<double, INSIZE>&x) const;
};
当这段代码的任何部分由于被(几乎)零除或由于域错误而失败时,整个代码应该失败,并告诉调用者它不能为给定的输入计算这个函数。
这也适用于仅用于比较的计算值。因此,测试结果向量是否为NAN或无穷大是不够的。在每个易出错的操作后插入测试是不可行的。
怎么能这样呢?
我读过fetestexcept()。但是不清楚是什么重置了这个状态标志。SIGFPE除了调试之外对任何事情都没有用。能够像在Windows上那样将其转换为C++异常将是很好的,但是插入一个最终检查也足够了。
插入代码来检查以下代码的无效输入也是不可行的,因为这会显著降低计算速度。
1条答案
按热度按时间ubof19bj1#
我读过fetestexcept(),但不清楚是什么重置了这个状态标志。
这就是
feclearexcept()
所做的事情。所以你可以这样做异常标志是“粘滞的”,除了显式的
feclearexcept()
之外,没有其他操作可以清除它们。使用
feenablexcept()
强制执行SIGFPE的主要好处是,您可以立即检测到错误,而不必等到您碰巧抽出时间测试异常标志,并且您可以精确定位导致异常的确切指令。