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)。