C 溢出vs Inf

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()函数抛出异常。浮点 用于浮点操作的。 本标准规定了五种例外情况: 无效操作 除零 溢出 底流

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

  • Inf
    是溢出异常吗

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

  • 如果不是,我可以在Matlab中获得溢出异常吗

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

  • 另外,我不希望在Matlab中检查
    Inf
    ,然后使用
    error()
    函数抛出异常。

    浮点 用于浮点操作的。 本标准规定了五种例外情况:

  • 无效操作
  • 除零
  • 溢出
  • 底流
  • 不精确
  • 如所述,这些异常由状态字指示,但不会终止程序。 相反,返回一个依赖于异常的默认值;该值可以是实际数字或特殊值。MATLAB中的特殊值包括
    Inf
    -Inf
    NaN
    -0
    ;这些MATLAB符号用于替代官方标准的保留二进制表示法,以提高可读性和可用性(有点漂亮的语法糖)。 特殊值的操作定义明确,操作直观

    有了这些信息,问题的答案如下:

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

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

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

  • 见答复1

  • 有关更多有趣和深入的示例


    整数 整数在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的情况下执行操作
    IEEE754的原理在默认情况下是这样的,但要产生特殊的值(
    Inf
    NaN
    ),并允许正常继续计算而不中断程序。这取决于用户对这些结果进行测试并分别处理(如MATLAB中的
    isinf
    isnan
    函数)

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

    浮点环境和FP异常存在(平台相关)函数:

    • Win32 API必须控制FPU标志
    • POSIX/Linux系统通常通过捕获SIGFPE信号(请参阅)
    • SunOS/Solaris也有自己的功能(请参阅Sun/Oracle中的第4章)
    • C99/C++11引入了带有控制浮点异常标志的函数的标头
    例如,查看Python如何为不同平台实现FP异常控制模块:

    2) C/C中的整数++ 这显然与浮点完全不同,因为整数类型不能表示Inf或NaN:

    • 使用无符号整数(因此,如果结果超过最大整数,值将环绕)。这意味着无符号算术运算的结果始终是“数学定义的”,并且永远不会溢出。将其与用于整数的MATLAB进行比较(
      uint8(200)+uint8(200)
      将是
      uint8(255)
    • 另一方面,有符号整数溢出是错误的
    • 是未定义的行为

    @lakesh你什么意思?@lakesh我不想计算。而且
    1e^309
    不正确。我想你是说
    10^309=1.0e309
    。你为什么要这样做?检查
    Inf
    然后抛出异常有什么不对?这是一个有效且有趣的问题。那些投票反对或投票结束的人应该仔细阅读和溢出