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编译器如何评估这个?
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吗?
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |