matlab溢出的标志inf,关于C#:溢出与信息

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

Inf是否是溢出异常?

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

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

Inf和溢出异常之间有什么区别吗?

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

@lakesh是什么意思?

@lakesh我不想计算。 同样,1e^309不正确。 我认为您的意思是10^309=1.0e309。

你为什么要这样做? 检查Inf然后抛出异常怎么办?

@David我想这样做只是为了学习。 我想知道溢出异常和Inf之间有什么区别;)

这是一个有效而有趣的问题。 那些反对投票或投票关闭的人应阅读浮点规范如何处理无穷大和溢出的内容。 就像Matlab中一样,它们通常是混合在一起的,但是两者并不相同。

我也不明白反对票。 这是一个完全正确的问题,我实际上对此感到好奇!

1)C / C ++中的浮点

对浮点数进行运算可能会产生非数值的结果。例子:

运算的结果是一个复数(请考虑sqrt(-1.0))

操作的结果是不确定的(请考虑1.0 / 0.0)

运算结果太大而无法表示

在其中一个操作数已经为NaN或Inf的情况下执行操作

IEEE754的理念是默认情况下不捕获此类异常,而是生成特殊值(Inf和NaN),并允许计算正常继续而不中断程序。用户可以测试这些结果并分别进行处理(如MATLAB中的isinf和isnan函数)。

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

有(与平台有关的)函数可以控制浮点环境并捕获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:

无符号整数使用模块化算术(因此,如果结果超过最大整数,则值会回绕)。这意味着无符号算术运算的结果始终是"数学定义的",并且永远不会溢出。将此与使用饱和算术对整数(uint8(200) + uint8(200)将为uint8(255))的MATLAB进行比较。

另一方面,有符号整数溢出是未定义的行为。

整数除以零是未定义的行为。

我将重复" MATLAB Answers"网站上的Jan Simon的回答:

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

warning on MATLAB:divideByZero

dbstop if warning MATLAB:divideByZero

类似地,停止取对数零:

warning on MATLAB:log:LogOfZero

dbstop if warning MATLAB:log:LogOfZero

当操作(函数调用或赋值)返回NaN或Inf时停止运行,请使用:

dbstop if naninf

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

9ca8ca917790cbeccae301610bfa8423.png

65b0320c0e99624ad2a226becea8503f.png

另请参阅此问题和解答以及来自Undocumented Matlab的有关捕获警告的文章。

浮点

MATLAB为浮点运算实现了IEEE标准754。

该标准有五个已定义的例外:

无效的操作

被零除

溢出

下溢

不精确

正如GNU C库所指出的那样,这些异常由状态字指示,但不会终止程序。

而是返回一个与异常有关的默认值。该值可以是实际数字,也可以是特殊值。MATLAB中的特殊值是Inf,-Inf,NaN和-0;这些MATLAB符号用于代替官方标准的保留二进制表示形式,以提高可读性和可用性(有点漂亮的语法糖)。

特殊值上的操作定义明确,并且操作直观。

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

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

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

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

参见答案1。

有关更多有趣和深入的示例,这是一个不错的PDF。

整数

整数在MATLAB中的行为不如上述。

如果对指定位大小的整数进行的运算将超过该类的最大值,则对于负数(如果有符号),它将被设置为最大值,反之亦然。

换句话说,MATLAB整数不会自动换行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值