例如,当我在 Matlab 中输入一个大于 max double的数字时,它会返回。出于教育目的,我想获得像C编译器这样返回溢出错误消息的溢出异常,而不是. 我的问题是:1.79769e+308
10^309
Inf
Inf
是
Inf
溢出异常吗?如果是,为什么C编译器不返回
Inf
?如果没有,我可以在 Matlab 中得到溢出异常吗?
Inf
和溢出异常有什么区别吗?
另外我不想在 Matlab 中检查,然后用函数Inf
抛出异常。error()
例如,当我在 Matlab 中输入一个大于 max double的数字时,它会返回。出于教育目的,我想获得像C编译器这样返回溢出错误消息的溢出异常,而不是. 我的问题是:1.79769e+308
10^309
Inf
Inf
是Inf
溢出异常吗?
如果是,为什么C编译器不返回Inf
?
如果没有,我可以在 Matlab 中得到溢出异常吗?
Inf
和溢出异常有什么区别吗?
另外我不想在 Matlab 中检查,然后用函数Inf
抛出异常。error()
对浮点数的运算可能会产生不是数值的结果。例子:
sqrt(-1.0)
)1.0 / 0.0
)IEEE754 的理念是默认不捕获此类异常,而是生成特殊值(Inf
和NaN
),并允许计算在不中断程序的情况下正常继续。用户可以测试这些结果并分别处理它们(如MATLAB 中的isinf
和isnan
函数)。
存在两种类型的 NaN值:NaN (Quiet NaN) 和 sNaN (Signaling NaN)。通常浮点数的所有算术运算在运算不能成功完成时都会产生静默类型(不是信令类型)。
_control87()
控制 FPU 标志。feenableexcept
(请参阅 参考资料)。fenv
带有控制浮点异常标志的函数的头文件。例如,查看 Python 如何针对不同平台实现 FP 异常控制模块:https ://hg.python.org/cpython/file/tip/Modules/fpectlmodule.c
这显然与浮点完全不同,因为整数类型不能表示 Inf 或 NaN:
MATLAB为浮点运算实现了IEEE 标准 754 。本标准有五个定义的例外:
正如GNU C 库所指出的,这些异常由状态字指示,但不会终止程序。而是返回一个依赖于异常的默认值;该值可以是实际数字或特殊值 MATLAB 中的特殊值是Inf
、-Inf
、NaN
和-0
; 这些 MATLAB 符号用于代替官方标准的保留二进制表示,以提高可读性和可用性(有点漂亮的语法糖)。对特殊值的操作定义明确,操作直观。
有了这些信息,问题的答案是:
Inf
表示执行的操作引发了上述异常之一(即 1、2 或 3),Inf
并被确定为默认返回值。
取决于C
程序的编写方式、正在使用的编译器、存在的硬件INFINITY
以及NaN
操作可以返回的特殊值C
。这取决于是否以及如何实施 IEEE-754 标准。C99 将 IEEE-754 实现作为标准的一部分,但最终由编译器决定实现的工作方式(这可能会因积极的优化和舍入模式等标准选项而变得复杂)。
返回值Inf
or-Inf
表示可能发生了溢出异常,但也可能是无效操作或除以零。我认为 MATLAB 不会告诉您它是什么(尽管您可能可以通过编译的 MEX 文件访问该信息,但我不熟悉这些)。
见答案 1。
要获得更多有趣和深入的示例,这里是一个不错的 PDF。
整数在 MATLAB 中的行为与上述不同。如果对指定位大小的整数的操作将超过该类的最大值,则它将设置为最大值,反之亦然,用于负数(如果有符号)。换句话说,MATLAB 整数不会换行。
我将重复“MATLAB Answers”网站上Jan Simon的回答:
要在除零时停止(在调试器模式下),请使用:
warning on MATLAB:divideByZero
dbstop if warning MATLAB:divideByZero
类似地停止取零的对数:
warning on MATLAB:log:LogOfZero
dbstop if warning MATLAB:log:LogOfZero
当操作(函数调用或赋值)返回NaN
or时停止Inf
,请使用:
dbstop if naninf
不幸的是,似乎不再支持前两个警告,尽管最后一个选项在 R2014a 上仍然适用于我并且实际上已记录在案。