c - 溢出与信息

标签 c matlab exception floating-point floating-point-exceptions

当我输入一个大于最大值 double 的数字时在 Matlab 中约为 1.79769e+308,例如 10^309,它返回 Inf。出于教育目的,我想要像 C 编译器那样返回溢出错误消息的溢出异常,而不是 Inf。我的问题是:

  1. Inf是溢出异常吗?

  2. 如果是,为什么 C 编译器不返回 Inf

  3. 如果不行,我在Matlab中能不能得到溢出异常?

  4. 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默认情况下,但要生成特殊值(InfNaN),并允许计算继续正常进行而不中断程序。由用户测试此类结果并分别对待它们(如 MATLAB 中的 isinfisnan 函数)。

存在two types of NaN值:NaN(安静 NaN)和 sNaN(信号 NaN)。正常情况下,所有 float 的算术运算在不能成功完成时都会产生quiet类型(不是signaling类型)。

control 有(平台相关的)函数浮点环境和 catch FP 异常:

例如,查看 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/

相关文章:

java - 将数据库异常信息传输给客户端的最佳实践

c - C中任意长度的字符串

matlab - MATLAB中如何将函数存储在变量中?

python - 在 python 与 matlab 中切片矩阵

c++ - 类构造函数异常后清理数据

java - 异常处理——优雅退出

c - 使用 fgetc C 从文件读取字符串时出现问题(不使用 fscanf 等)

c++ - VeriFone 终端应用程序可以通过以太网进行通信,还可以存储本地数据吗?

c - 如何获取特定字符后的所有文本?

arrays - Matlab:如何随机打乱矩阵的列