0

我有以下一段 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...
}

我正在使用激活了 -fp-trap=all 标志的 intel c++ 编译器。通过 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";

我真的不明白发生了什么。分工似乎很明确。

4

1 回答 1

2

我假设您使用的是英特尔 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)。

于 2020-09-17T22:28:05.907 回答