4

例如,当我在 Matlab 中输入一个大于 max double的数字时,它会返回。出于教育目的,我想获得像C编译器这样返回溢出错误消息的溢出异常,而不是. 我的问题是:1.79769e+30810^309InfInf

  1. Inf溢出异常吗?

  2. 如果是,为什么C编译器不返回Inf

  3. 如果没有,我可以在 Matlab 中得到溢出异常吗?

  4. Inf和溢出异常有什么区别吗?

另外我不想在 Matlab 中检查,然后用函数Inf抛出异常。error()

4

3 回答 3

3

1) C/C++ 中的浮点数

浮点数的运算可能会产生不是数值的结果。例子:

  • 运算的结果是一个复数(想想sqrt(-1.0)
  • 操作的结果是未定义的(想想1.0 / 0.0
  • 操作的结果太大而无法表示
  • 在其中一个操作数已经是 NaN 或 Inf 的情况下执行操作

IEEE754 的理念是默认不捕获此类异常,而是生成特殊值(InfNaN),并允许计算在不中断程序的情况下正常继续。用户可以测试这些结果并分别处理它们(如MATLAB 中的isinfisnan函数)。

存在两种类型的 NaN值:NaN (Quiet NaN) 和 sNaN (Signaling NaN)。通常浮点数的所有算术运算在运算不能成功完成时都会产生静默类型(不是信令类型)。

有(平台相关的)函数来控制浮点环境和捕获FP 异常:

例如,查看 Python 如何针对不同平台实现 FP 异常控制模块:https ://hg.python.org/cpython/file/tip/Modules/fpectlmodule.c

2) C/C++ 中的整数

这显然与浮点完全不同,因为整数类型不能表示 Inf 或 NaN:

  • 无符号整数使用模算术(如果结果超过最大整数,则值环绕)。这意味着无符号算术运算的结果始终是“数学定义的”并且永远不会溢出。将此与 MATLAB 进行比较,后者对整数使用饱和算法uint8(200) + uint8(200)will be uint8(255))。
  • 另一方面,有符号整数溢出是未定义的行为
  • 整数 除以 是未定义的行为。
于 2014-10-28T16:04:40.580 回答
2

浮点

MATLAB为浮点运算实现了IEEE 标准 754 。本标准有五个定义的例外:

  1. 无效操作
  2. 被零除
  3. 溢出
  4. 下溢
  5. 不精确

正如GNU C 库所指出的,这些异常由状态字指示,但不会终止程序。而是返回一个依赖于异常的默认值;该值可以是实际数字或特殊值 MATLAB 中的特殊值是Inf-InfNaN-0; 这些 MATLAB 符号用于代替官方标准的保留二进制表示,以提高可读性和可用性(有点漂亮的语法糖)。对特殊值的操作定义明确,操作直观。

有了这些信息,问题的答案是:

  1. Inf表示执行的操作引发了上述异常之一(即 1、2 或 3),Inf并被确定为默认返回值。

  2. 取决于C程序的编写方式、正在使用的编译器、存在的硬件INFINITY以及NaN操作可以返回的特殊值C。这取决于是否以及如何实施 IEEE-754 标准。C99 将 IEEE-754 实现作为标准的一部分,但最终由编译器决定实现的工作方式(这可能会因积极的优化和舍入模式等标准选项而变得复杂)。

  3. 返回值Infor-Inf表示可能发生了溢出异常,但也可能是无效操作或除以零。我认为 MATLAB 不会告诉您它是什么(尽管您可能可以通过编译的 MEX 文件访问该信息,但我不熟悉这些)。

  4. 见答案 1。

要获得更多有趣和深入的示例,这里是一个不错的 PDF


整数

整数在 MATLAB 中的行为与上述不同。如果对指定位大小的整数的操作将超过该类的最大值,则它将设置为最大值,反之亦然,用于负数(如果有符号)。换句话说,MATLAB 整数不会换行。

于 2014-10-27T19:36:31.867 回答
2

我将重复“MATLAB Answers”网站上Jan Simon的回答:

要在除零时停止(在调试器模式下),请使用:

warning on MATLAB:divideByZero
dbstop if warning MATLAB:divideByZero

类似地停止取零的对数:

warning on MATLAB:log:LogOfZero
dbstop if warning MATLAB:log:LogOfZero

当操作(函数调用或赋值)返回NaNor时停止Inf,请使用:

dbstop if naninf

不幸的是,似乎不再支持前两个警告,尽管最后一个选项在 R2014a 上仍然适用于我并且实际上已记录在案

error_warning_handling_dialog1 error_warning_handling_dialog2

于 2014-10-28T13:12:25.607 回答