诊断C++程序中的浮点溢出

cls*_*udt 16 c++ floating-point double numeric overflow

我有一种情况,就是一些数值结果(包括浮点运算与doublefloat)成为不正确的大尺寸输入,而不是小的.

一般来说,我想知道哪些工具可用于诊断数值溢出和有问题的精度损失等条件.

换句话说:是否存在一个抱怨溢出等的工具,就像valgrind抱怨内存错误一样?

Jos*_*ley 8

如果启用浮点异常,则FPU可以在溢出时抛出异常.这究竟是如何工作的依赖于操作系统.例如:

  • 在Windows上,您可以使用_control87取消屏蔽_EM_OVERFLOW,以便在溢出时获得C++异常.
  • 在Linux上,您可以使用feenableexceptFE_OVERFLOW上启用异常,以便在溢出时获得SIGFPE.例如,要启用所有例外,请拨打feenableexcept(FE_ALL_EXCEPT)您的电话main.要启用溢出并除以零,请调用feenableexcept(FE_OVERFLOW | FE_DIVBYZERO).

请注意,在所有情况下,第三方代码可能会禁用您已启用的异常; 这在实践中可能很少见.

这可能不如Valgrind那么好,因为它更像是一个调试器和手动检查,而不是一个最后得到的总结,但它的工作原理.

  • 您可能不希望为不准确的操作启用陷阱.在大多数浮点代码中,不精确的操作是正常的和预期的,并且启用异常将导致几乎每个浮点操作的陷阱.除非您的代码经过精心设计,永远不要在正常条件下使用不精确的操作或使用陷阱以特殊方式改变浮点行为,否则为不精确的操作启用陷阱将是一项艰苦的工作. (4认同)