C 溢出vs Inf
当我在Matlab中输入一个大于max的数字,大约是C 溢出vs Inf,c,matlab,exception,floating-point,floating-point-exceptions,C,Matlab,Exception,Floating Point,Floating Point Exceptions,当我在Matlab中输入一个大于max的数字,大约是1.79769e+308,例如10^309,它返回Inf。出于教育目的,我希望得到溢出异常,比如返回溢出错误消息的C编译器,而不是Inf。我的问题是: Inf是溢出异常吗 如果是,为什么C编译器不返回Inf 如果不是,我可以在Matlab中获得溢出异常吗 Inf和溢出异常之间有什么区别吗 另外,我不希望在Matlab中检查Inf,然后使用error()函数抛出异常。浮点 用于浮点操作的。 本标准规定了五种例外情况: 无效操作 除零 溢出 底流
1.79769e+308
,例如10^309
,它返回Inf
。出于教育目的,我希望得到溢出异常,比如返回溢出错误消息的C编译器,而不是Inf
。我的问题是:
Inf
是溢出异常吗Inf
Inf
和溢出异常之间有什么区别吗Inf
,然后使用error()
函数抛出异常。浮点
用于浮点操作的。
本标准规定了五种例外情况:
Inf
、-Inf
、NaN
和-0
;这些MATLAB符号用于替代官方标准的保留二进制表示法,以提高可读性和可用性(有点漂亮的语法糖)。
特殊值的操作定义明确,操作直观
有了这些信息,问题的答案如下:
Inf
表示执行了引发上述异常之一(即1、2或3)的操作,并且Inf
被确定为默认返回值C
程序的编写方式,正在使用的编译器和存在的硬件是可由C
操作返回的特殊值。这取决于IEEE-754标准是否以及如何实施。C99将IEEE-754实现作为标准的一部分,但最终取决于编译器如何实现(激进的优化和舍入模式等标准选项会使这一点变得复杂)Inf
或-Inf
表示可能发生了溢出异常,但也可能是无效操作或被零除。我不认为MATLAB会告诉你它是什么(虽然也许你可以通过编译的MEX文件访问这些信息,但我不熟悉这些)整数 整数在MATLAB中的行为与上述不同。 如果对指定位大小的整数的操作将超过该类的最大值,则它将被设置为最大值,反之亦然(如果有符号)。
换句话说,MATLAB整数不换行。我将重复“MATLAB答案”网站上的答案: 要停止(在调试器模式下)除以零,请使用:
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上仍然适用于我,事实上是
1)C/C中的浮点++
对的操作可能会产生非数值的结果。示例:
- 运算的结果是一个复数(想想
)sqrt(-1.0)
- 操作的结果未定义(想想
)1.0/0.0
- 操作的结果太大,无法表示
- 在其中一个操作数已为NaN或Inf的情况下执行操作
Inf
和NaN
),并允许正常继续计算而不中断程序。这取决于用户对这些结果进行测试并分别处理(如MATLAB中的isinf
和isnan
函数)
存在值:NaN(安静NaN)和sNaN(信号NaN)。通常,当操作无法成功完成时,浮点数的所有算术运算都将生成静默类型(不是信令类型)
浮点环境和FP异常存在(平台相关)函数:
- Win32 API必须控制FPU标志
- POSIX/Linux系统通常通过捕获SIGFPE信号(请参阅)
- SunOS/Solaris也有自己的功能(请参阅Sun/Oracle中的第4章)
- C99/C++11引入了带有控制浮点异常标志的函数的标头
- 使用无符号整数(因此,如果结果超过最大整数,值将环绕)。这意味着无符号算术运算的结果始终是“数学定义的”,并且永远不会溢出。将其与用于整数的MATLAB进行比较(
将是uint8(200)+uint8(200)
)uint8(255)
- 另一方面,有符号整数溢出是错误的
- 是未定义的行为
1e^309
不正确。我想你是说10^309=1.0e309
。你为什么要这样做?检查Inf
然后抛出异常有什么不对?这是一个有效且有趣的问题。那些投票反对或投票结束的人应该仔细阅读和溢出