首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >溢出vs Inf

溢出vs Inf
EN

Stack Overflow用户
提问于 2014-10-27 03:03:36
回答 3查看 758关注 0票数 4

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

  1. Inf是溢出异常吗?
  2. 如果是,为什么C编译器不返回Inf
  3. 如果没有,我可以在Matlab中得到溢出异常吗?
  4. Inf和溢出异常之间有什么区别吗?

另外,我不希望在Matlab中检查Inf,然后抛出一个带有error()函数的异常。

EN

回答 3

Stack Overflow用户

发布于 2014-10-28 16:04:40

1) C/C++中的浮点数

浮点数的操作可以产生非数值的结果。示例:

  • 操作的结果是一个复数(假设为sqrt(-1.0))
  • 操作的结果未定义(如1.0 / 0.0)
  • 操作的结果太大,无法表示。
  • 在其中一个操作数已经是NaN或Inf的情况下执行操作。

IEEE754的哲学是默认不设陷阱这样的例外情况,但是要生成特殊的值(InfNaN),并且允许计算在不中断程序的情况下正常地继续进行。这取决于用户测试这些结果,并将其单独处理(如MATLAB中的isinfisnan函数)。

存在两种类型的NaN值: NaN (静音NaN)和sNaN (Signaling )。通常,当操作无法成功完成时,浮点数的所有算术操作都会产生安静类型(而不是信令类型)。

有(平台相关的)函数用于控制浮点环境和捕捉 FP异常:

  • Win32 API有_control87()来控制FPU标志。
  • POSIX/Linux系统通常通过捕获SIGFPE信号来捕获处理FP异常 (参见feenableexcept)。
  • SunOS/Solaris也有自己的功能(见Sun/Oracle在数值计算指南中的第4章)
  • C99/C++11引入了具有控制浮点异常标志的函数的fenv头.

例如,查看Python如何为不同平台实现FP异常控制模块:https://hg.python.org/cpython/file/tip/Modules/fpectlmodule.c

2) C/C++中的整数

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

  • 无符号整数使用模算法 (如果结果超过最大整数,则值环绕)。这意味着,无符号算术运算的结果总是“数学上定义的”,永远不会溢出。将其与使用饱和算法表示整数的MATLAB进行比较(uint8(200) + uint8(200)将是uint8(255))。
  • 另一方面,有符号整数溢出是未定义行为
  • 整数 分部 是未定义的行为。
票数 3
EN

Stack Overflow用户

发布于 2014-10-27 19:36:31

浮点

MATLAB实现用于浮点操作的IEEE标准754。这一标准有五个明确的例外:

  1. 无效操作
  2. 除以零
  3. 溢出
  4. 底流
  5. 不准确

正如GNU C库所指出的,这些异常由状态字指示,但不终止程序。相反,返回一个与异常相关的默认值;该值可能是一个实际数字,也可能是一个特殊值-- MATLAB中的特殊值是Inf-InfNaN-0;这些MATLAB符号被用来代替官方标准的保留二进制表示,以提高可读性和可用性(有点好的语法糖)。对特殊值的操作定义良好,操作直观.

在掌握了这些资料后,问题的答案如下:

  1. Inf意味着执行了引发上述异常之一(即1、2或3)的操作,而Inf被确定为默认返回值。
  2. 根据C程序的编写方式、所使用的编译器以及存在的硬件,NaNC操作可以返回的特殊值。这取决于IEEE-754标准的实施方式。C99将IEEE-754实现作为标准的一部分,但最终取决于编译器如何实现(这可以通过激进的优化和标准选项(如舍入模式)来完成)。
  3. 返回值Inf-Inf表示可能发生溢出异常,但也可能是无效的操作或除以零。我不认为MATLAB会告诉你它是哪一个(虽然你可以通过编译后的MEX文件访问这些信息,但我对这些文件并不熟悉)。
  4. 见答案1。

为了获得更多有趣和深入的例子,这是一个很好的PDF格式

整数

整数在MATLAB中的表现不像上面那样。如果对指定位大小的整数的操作将超过该类的最大值,则它将被设置为最大值,反之亦然。换句话说,MATLAB整数不会包装。

票数 2
EN

Stack Overflow用户

发布于 2014-10-28 13:12:25

我将重复http://www.mathworks.com/matlabcentral/answers/42072-divide-by-zero#answer_51831在"MATLAB答案“网站上的回答:

要在零除法模式下停止(在调试器模式下),请使用:

代码语言:javascript
复制
warning on MATLAB:divideByZero
dbstop if warning MATLAB:divideByZero

类似地,当取零的对数时停止:

代码语言:javascript
复制
warning on MATLAB:log:LogOfZero
dbstop if warning MATLAB:log:LogOfZero

对于在操作(函数调用或赋值)返回NaNInf时停止,请使用:

代码语言:javascript
复制
dbstop if naninf

不幸的是,前两个警告似乎是不再支持,尽管最后一个选项在R2014a上仍然有效,实际上是记录在案

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26580611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档