当我输入一个大于最大值 double 的数字时在 Matlab 中约为 1.79769e+308
,例如 10^309
,它返回 Inf
。出于教育目的,我想要像 C 编译器那样返回溢出错误消息的溢出异常,而不是 Inf
。我的问题是:
Inf
是溢出异常吗?如果是,为什么 C 编译器不返回
Inf
?如果不行,我在Matlab中能不能得到溢出异常?
Inf
和溢出异常有什么区别吗?
此外,我不想在 Matlab 中检查 Inf
,然后使用 error()
函数抛出异常。
最佳答案
1) C/C++ 中的 float
对 floating-point numbers 的操作可以产生非数值的结果。示例:
- 操作的结果是一个复数(想想
sqrt(-1.0)
) - 操作的结果是未定义的(想想
1.0/0.0
) - 操作的结果太大而无法表示
- 执行一个操作,其中一个操作数已经是 NaN 或 Inf
IEEE754 的理念是 to not trap这样exceptions默认情况下,但要生成特殊值(Inf
和 NaN
),并允许计算继续正常进行而不中断程序。由用户测试此类结果并分别对待它们(如 MATLAB 中的 isinf
和 isnan
函数)。
存在two types of NaN值:NaN(安静 NaN)和 sNaN(信号 NaN)。正常情况下,所有 float 的算术运算在不能成功完成时都会产生quiet类型(不是signaling类型)。
control 有(平台相关的)函数浮点环境和 catch FP 异常:
- Win32 API 有
_control87()
控制 FPU 标志。 - 通常是 POSIX/Linux 系统 handle FP exception通过捕获 SIGFPE 信号(参见
feenableexcept
)。 - SunOS/Solaris 也有自己的功能(参见 Sun/Oracle 的 Numerical Computation Guide 中的第 4 章)
- C99/C++11 引入了
fenv
带有控制浮点异常标志的函数的 header 。
例如,查看 Python 如何针对不同平台实现 FP 异常控制模块:https://hg.python.org/cpython/file/tip/Modules/fpectlmodule.c
2) C/C++ 中的整数
这显然与 float 完全不同,因为整数类型不能表示 Inf 或 NaN:
- 无符号整数使用 modular arithmetic (因此,如果结果超过最大整数,则值环绕)。这意味着无符号算术运算的结果始终是“数学定义的”并且永远不会溢出。将其与使用 saturation arithmetic 的 MATLAB 进行比较对于整数(
uint8(200) + uint8(200)
将是uint8(255)
)。 - 另一方面,有符号整数溢出是 undefined behavior .
- integer division by zero是未定义的行为。
关于c - 溢出与信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26580611/