当我输入一个大于 max 的数字时double https://en.wikipedia.org/wiki/Double-precision_floating-point_format在 Matlab 中大约是1.79769e+308
, 例如10^309
,它返回Inf
。出于教育目的,我想获得溢出异常,例如C返回溢出错误消息的编译器,而不是Inf
。我的问题是:
Is Inf
溢出异常?
如果是,为什么C编译器不返回Inf
?
如果没有,Matlab 中会出现溢出异常吗?
有什么区别吗Inf
和溢出异常吗?
我也不想检查Inf
在 Matlab 中,然后抛出异常error()
功能。
1) C/C++ 中的浮点
操作于浮点数字 http://www.johndcook.com/IEEE_exceptions_in_cpp.html可以产生非数值的结果。例子:
- 运算的结果是一个复数(认为
sqrt(-1.0)
)
- 操作的结果是未定义的(认为
1.0 / 0.0
)
- 运算结果太大而无法表示
- 执行操作时其中一个操作数已经是 NaN 或 Inf
IEEE754的理念是为了不被困住 http://www.jdl.co.uk/briefings/divByZeroInCpp.html such 例外情况 https://en.wikipedia.org/wiki/IEEE_floating_point#Exception_handling默认情况下,但要产生特殊值(Inf
and NaN
),并允许计算正常继续而不中断程序。由用户来测试此类结果并单独处理它们(例如isinf
and isnan
MATLAB 中的函数)。
存在两种类型的 NaN https://stackoverflow.com/questions/18118408/what-is-difference-between-quiet-nan-and-signaling-nan值:NaN(安静 NaN)和 sNaN(信号 NaN)。通常,当运算无法成功完成时,所有浮点数的算术运算都会产生安静类型(而不是信号类型)。
有(依赖于平台的)功能control https://stackoverflow.com/questions/2219244/dealing-with-floating-point-exceptions浮点环境和catch https://stackoverflow.com/questions/2941611/can-i-make-gcc-tell-me-when-a-calculation-results-in-nan-or-inf-at-runtimeFP 例外:
- Win32 API 有_control87() http://msdn.microsoft.com/en-us/library/e9b52ceh.aspx控制 FPU 标志。
- 典型的 POSIX/Linux 系统处理FP异常 http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Control-Functions.html通过捕获 SIGFPE 信号(参见feenableexcept http://linux.die.net/man/3/feenableexcept).
- SunOS/Solaris 也有其自己的功能(参见第 4 章)数值计算指南 http://docs.oracle.com/cd/E19957-01/806-3568/由 Sun/Oracle 提供)
- C99/C++11引入了fenv http://en.cppreference.com/w/cpp/numeric/fenv带有控制浮点异常标志的函数的标头。
例如,看看Python如何实现不同平台的FP异常控制模块:https://hg.python.org/cpython/file/tip/Modules/fpectlmodule.c https://hg.python.org/cpython/file/tip/Modules/fpectlmodule.c
2) C/C++ 中的整数
这显然与浮点数完全不同,因为整数类型不能表示 Inf 或 NaN:
- 无符号整数使用模运算 https://en.wikipedia.org/wiki/Modular_arithmetic(因此,如果结果超过最大整数,则值会环绕)。这意味着无符号算术运算的结果始终是“数学定义的”并且永远不会溢出。将此与 MATLAB 进行比较,其中使用饱和算术 https://en.wikipedia.org/wiki/Saturation_arithmetic对于整数 (
uint8(200) + uint8(200)
将uint8(255)
).
- 另一方面有符号整数溢出是未定义的行为 https://en.wikipedia.org/wiki/Undefined_behavior.
-
integer https://stackoverflow.com/questions/3105591/how-to-catch-the-integer-division-by-zero-exception-in-c-language division https://stackoverflow.com/questions/12617408/a-few-things-about-division-by-zero-in-c by zero https://stackoverflow.com/questions/4747934/c-catch-a-divide-by-zero-error是未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)