当我在Matlab中输入大于1.79769e+308
的最大double的数字时,例如10^309
,它会返回Inf
。出于教育目的,我希望得到溢出异常,例如返回溢出错误消息的 C 编译器,而不是Inf
。我的问题是:
Inf
是溢出异常吗?
如果是,为什么 C 编译器不返回Inf
?
如果没有,我可以在Matlab中获得溢出异常吗?
Inf
和溢出异常之间是否存在任何差异?
此外,我不想在Matlab中检查Inf
,然后使用error()
函数抛出异常。
答案 0 :(得分:2)
MATLAB implements IEEE Standard 754用于浮点运算。 该标准有五个定义的例外:
如GNU C Library所述,这些例外由状态字指示,但不终止程序。
相反,返回依赖于异常的默认值;值可以是实际数字或特殊值MATLAB中的特殊值为Inf
,-Inf
,NaN
和-0
;这些MATLAB符号用于代替官方标准的保留二进制表示,以提高可读性和可用性(有点好的语法糖)。
对特殊值的操作是明确定义的,并以直观的方式操作。
掌握了这些信息后,问题的答案是:
Inf
表示执行的操作引发了上述异常之一(即1,2或3),并且Inf
被确定为默认返回值。
根据C
程序的编写方式,正在使用的编译器以及存在的硬件,INFINITY
and NaN
是C
可以返回的特殊值操作。这取决于IEEE-754标准的实施方式。 C99将IEEE-754实现作为标准的一部分,但最终由编译器决定实现如何工作(这可能会因积极的优化和标准选项(如舍入模式)而变得复杂。)
返回值Inf
或-Inf
表示发生了溢出异常 ,但它也可能是无效操作或除零。我不认为MATLAB会告诉你它是什么(虽然你可以通过编译的MEX文件访问这些信息,但我不熟悉这些信息)。
见答案1.
有关更多有趣和深入的示例,here is a nice PDF。
整数在MATLAB中的行为与上述不同。 如果对指定位大小的整数的操作将超过该类的最大值,则将其设置为最大值,反之亦然(如果已签名)。 换句话说,MATLAB整数不会换行。
答案 1 :(得分: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
并且当操作(函数调用或赋值)返回NaN
或Inf
时停止,请使用:
dbstop if naninf
不幸的是,前两个警告似乎是no longer supported,尽管最后一个选项在R2014a上仍适用于我,实际上是documented。
答案 2 :(得分:2)
floating-point numbers上的操作可以产生非数值的结果。例子:
sqrt(-1.0)
)1.0 / 0.0
) IEEE754的哲学默认为to not trap exceptions,但要生成特殊值(Inf
和NaN
),并允许计算正常继续而不会中断程序。用户可以测试这些结果并单独处理(如MATLAB中的isinf
和isnan
函数)。
存在two types of NaN个值:NaN(Quiet NaN)和sNaN(信号NaN)。通常,当操作无法成功完成时,浮点数的所有算术运算都将产生静默类型(不是信号类型)。
({3}}浮点环境和control FP异常有(平台相关的)函数:
_control87()
捕获SIGFPE信号(参见handle FP exception)。feenableexcept
中的第4章)例如,查看Python如何为不同平台实现FP异常控制模块:fenv
这显然与浮点完全不同,因为整数类型不能表示Inf或NaN:
uint8(200) + uint8(200)
将为uint8(255)
)。