微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SIGFPE,算术异常,定义明确的除法

如何解决SIGFPE,算术异常,定义明确的除法

我有以下一段c ++代码

void update(const int step,const int total) const
{
   double s = static_cast<double>(step);

   double t = static_cast<double>(total);

   std::cout << s/t <<"------\n";

   // etc...
}

我正在使用intel c ++编译器并激活-fp-trap = all标志。通过gdb运行代码时,出现以下错误

Program received signal SIGFPE,Arithmetic exception.
0x000000000040ee07 in NilDa::progressBar::update (this=0x7fffffffbc9c,step=1,total=60000) at /home/d2d/dev/NilDa/sources/utils/progressBar.h:69
69  std::cout << s/t <<"------\n";

我不太了解发生了什么。该划分似乎定义明确。

解决方法

我假设您使用的是Intel C ++编译器(我不知道任何其他编译器都带有这种标志)。 如果是这样,您可以在这里看看:https://software.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/compiler-reference/compiler-options/compiler-option-details/floating-point-options/fp-trap-qfp-trap.html#

如该文档中所述,参数all继承了错误结果([no]inexact)的陷阱

启用或禁用IEEE陷阱以获取不精确的结果。

由于1/60000不能用浮点数表示,因此结果不精确(1.66667e-05)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。