1 /(1.0/0.0)在C中评估为零

Huz*_*ifa -1 c operator-precedence

在C中评估以下表达式时,输出为零而不是无穷大.但是根据C运算符优先级规则,输出应该是无穷大.

double a=1/(1.0/0.0);
printf("a : %.18le\n", a);
Run Code Online (Sandbox Code Playgroud)

请解释一下gcc编译器如何评估这个?

Lan*_*ing 6

C标准没有规定双精度如何处理NaN和Inf数,但是对于gcc,行为是由IEEE 754严格模式决定的:https://en.wikipedia.org/wiki/IEEE_754

从那篇文章:

该标准定义了五个异常,每个异常都返回一个默认值,并且在发生异常时会引发相应的状态标志(除了在某些情况下出现下溢).不需要其他异常处理,但建议使用其他非默认替代方法(见下文).

五个可能的例外是:

  • 无效操作:数学上未定义,例如,负数的平方根.默认返回qNaN.

  • 除以零:对有限操作数的操作给出精确的无限结果,例如1/0或log(0).默认返回±无穷大.

  • 溢出:结果太大而无法正确表示(即,其无限指数范围的指数将大于emax).对于圆到最近模式,默认返回±无穷大.
  • 下溢:结果非常小(超出正常范围)并且不准确.默认情况下返回subnormal或零.
  • 不精确:确切(即,未接地)的结果无法准确表示.默认情况下返回正确舍入的结果.

但是在某些平台上,ieee 754兼容的浮点单元不可用,您应该强制执行软件浮点库,或者参考平台手册了解会发生什么.例如,arm的fpu具有'RunFast'模式,禁用严格的合规性.

一些进一步的信息:任何真实的CPU都不使用IEEE 754吗?