c++ - 每当设置某些数学 errno 值时,如何引发异常?
问题描述
errno
只要只设置了全局变量的某些值(更具体地说,我只对域错误的值感兴趣),我就需要能够全局停止我的 C++ 代码的执行EDOM
。
我已经看到该库math_errhandling
允许使用常量MATH_ERREXCEPT
来自动为每种数学错误引发错误。
就我而言,我有兴趣FE_INVALID
为我的代码中发生的每个域错误自动引发。
但是,我的代码本身已经处理了某些类型的数学错误,例如除零错误。因此,自动加注 anFE_DIVBYZERO
是完全不受欢迎的。
是否有一种实用的方法可以使用math_errhandling
或任何其他 C++ 库来实现这种部分异常引发?或者,我如何自己实现基于检查值的异常引发errno
?
解决方案
我怀疑你指的是math_errhandling
C++。那不是库,而是实现定义的常量,它告诉您实现如何处理错误处理。您不能通过 C++ 更改此常量的值,尽管您可能会通过某些编译器选项更改它的值(检查您的文档)。
即便如此,该标准仅定义了可能的值MATH_ERRNO==1
,MATH_ERREXCEPT==2
和 (隐含) MATH_ERRNO | MATH_ERREXCEPT==3
。你想知道MATH_ERREXCEPT
。这仅意味着您可以std::fetestexcept(FE_INVALID)
在每次通话后拨打电话。它不是throw
一个真正的 C++ 异常的自动,你可以catch
。
根本问题是 C++ 并不真正匹配面向矢量的现代 FP 硬件。对于高性能代码,编译器将合并许多操作,但 C++ 异常模型假定您可以查明确切的失败操作。IEEE754 受此影响较小,因为它的错误处理精度较低。使用NaN
允许更多的并行性。
推荐阅读
- javascript - reactjs如何显示pdf文件
- reactjs - mt-5 h 在顺风 css 中对 textarea 不起作用
- java - Eclipse 控制台在运行 AWT 窗口时显示损坏的字母
- azure - Web 服务器内置 Azure 应用服务
- android - 我可以使用 SqlDelight 创建一个内存数据库以在 Android 中运行吗?
- qt - .DAT 文件未在 qt 中使用 Quazip 库提取
- javascript - 如何从 openlayers 中的特征属性中获取属性?
- php - 根据表单外的单选按钮更改表单操作
- postgresql - 从 2.2.1 到 2.3.0 的更新问题 timescaledb
- java - 期待 ConcurrentModificationException 但得到 UnsupportedException