当我在Matlab中输入一个大于最大双倍 (近似1.79769e+308 )的数字时,例如10^309,它返回Inf。出于教育目的,我希望获得溢出异常,比如返回溢出错误消息的C编译器,而不是Inf。我的问题是:
Inf是溢出异常吗?InfInf和溢出异常之间有什么区别吗?另外,我不希望在Matlab中检查Inf,然后抛出一个带有error()函数的异常。
发布于 2014-10-28 16:04:40
1) C/C++中的浮点数
对浮点数的操作可以产生非数值的结果。示例:
sqrt(-1.0))1.0 / 0.0)IEEE754的哲学是默认不设陷阱这样的例外情况,但是要生成特殊的值(Inf和NaN),并且允许计算在不中断程序的情况下正常地继续进行。这取决于用户测试这些结果,并将其单独处理(如MATLAB中的isinf和isnan函数)。
存在两种类型的NaN值: NaN (静音NaN)和sNaN (Signaling )。通常,当操作无法成功完成时,浮点数的所有算术操作都会产生安静类型(而不是信令类型)。
_control87()来控制FPU标志。feenableexcept)。fenv头.例如,查看Python如何为不同平台实现FP异常控制模块:https://hg.python.org/cpython/file/tip/Modules/fpectlmodule.c。
2) C/C++中的整数
这显然与浮点数完全不同,因为整数类型不能表示Inf或NaN:
发布于 2014-10-27 19:36:31
浮点
MATLAB实现用于浮点操作的IEEE标准754。这一标准有五个明确的例外:
正如GNU C库所指出的,这些异常由状态字指示,但不终止程序。相反,返回一个与异常相关的默认值;该值可能是一个实际数字,也可能是一个特殊值-- MATLAB中的特殊值是Inf、-Inf、NaN和-0;这些MATLAB符号被用来代替官方标准的保留二进制表示,以提高可读性和可用性(有点好的语法糖)。对特殊值的操作定义良好,操作直观.
在掌握了这些资料后,问题的答案如下:
Inf意味着执行了引发上述异常之一(即1、2或3)的操作,而Inf被确定为默认返回值。C程序的编写方式、所使用的编译器以及存在的硬件,NaN是C操作可以返回的特殊值。这取决于IEEE-754标准的实施方式。C99将IEEE-754实现作为标准的一部分,但最终取决于编译器如何实现(这可以通过激进的优化和标准选项(如舍入模式)来完成)。Inf或-Inf表示可能发生溢出异常,但也可能是无效的操作或除以零。我不认为MATLAB会告诉你它是哪一个(虽然你可以通过编译后的MEX文件访问这些信息,但我对这些文件并不熟悉)。为了获得更多有趣和深入的例子,这是一个很好的PDF格式。
整数
整数在MATLAB中的表现不像上面那样。如果对指定位大小的整数的操作将超过该类的最大值,则它将被设置为最大值,反之亦然。换句话说,MATLAB整数不会包装。
发布于 2014-10-28 13:12:25
我将重复http://www.mathworks.com/matlabcentral/answers/42072-divide-by-zero#answer_51831在"MATLAB答案“网站上的回答:
要在零除法模式下停止(在调试器模式下),请使用:
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不幸的是,前两个警告似乎是不再支持,尽管最后一个选项在R2014a上仍然有效,实际上是记录在案。


https://stackoverflow.com/questions/26580611
复制相似问题