溢出vs Inf

时间:2014-10-27 03:03:37

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

当我在Matlab中输入大于1.79769e+308的最大double的数字时,例如10^309,它会返回Inf。出于教育目的,我希望得到溢出异常,例如返回溢出错误消息的 C 编译器,而不是Inf。我的问题是:

  1. Inf是溢出异常吗?

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

  3. 如果没有,我可以在Matlab中获得溢出异常吗?

  4. Inf和溢出异常之间是否存在任何差异?

  5. 此外,我不想在Matlab中检查Inf,然后使用error()函数抛出异常。

3 个答案:

答案 0 :(得分:2)

浮点

MATLAB implements IEEE Standard 754用于浮点运算。 该标准有五个定义的例外:

  1. 无效操作
  2. 分区
  3. 溢出
  4. 下溢
  5. 不精确
  6. GNU C Library所述,这些例外由状态字指示,但不终止程序。 相反,返回依赖于异常的默认值;值可以是实际数字或特殊值MATLAB中的特殊值为Inf-InfNaN-0;这些MATLAB符号用于代替官方标准的保留二进制表示,以提高可读性和可用性(有点好的语法糖)。 对特殊值的操作是明确定义的,并以直观的方式操作。

    掌握了这些信息后,问题的答案是:

    1. Inf表示执行的操作引发了上述异常之一(即1,2或3),并且Inf被确定为默认返回值。

    2. 根据C程序的编写方式,正在使用的编译器以及存在的硬件,INFINITY and NaNC可以返回的特殊值操作。这取决于IEEE-754标准的实施方式。 C99将IEEE-754实现作为标准的一部分,但最终由编译器决定实现如何工作(这可能会因积极的优化和标准选项(如舍入模式)而变得复杂。)

    3. 返回值Inf-Inf表示发生了溢出异常 ,但它也可能是无效操作或除零。我不认为MATLAB会告诉你它是什么(虽然你可以通过编译的MEX文件访问这些信息,但我不熟悉这些信息)。

    4. 见答案1.

    5. 有关更多有趣和深入的示例,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

并且当操作(函数调用或赋值)返回NaNInf时停止,请使用:

dbstop if naninf

不幸的是,前两个警告似乎是no longer supported,尽管最后一个选项在R2014a上仍适用于我,实际上是documented

error_warning_handling_dialog1 error_warning_handling_dialog2

答案 2 :(得分:2)

1)C / C ++中的浮点

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(Quiet NaN)和sNaN(信号NaN)。通常,当操作无法成功完成时,浮点数的所有算术运算都将产生静默类型(不是信号类型)。

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

例如,查看Python如何为不同平台实现FP异常控制模块:fenv

2)C / C ++中的整数

这显然与浮点完全不同,因为整数类型不能表示Inf或NaN: