我已经被问到这段代码的结果:
#include <stdio.h>
int main()
{
double a =0;
double b =2/ a;
printf("b=%f\n", b);
printf("SLABC\n");
return 0;
}
运行它,代码打印b=inf
和SLABC
,然后正确存在。
我无法理解为什么2/0的除法不会出现错误(如果它是int a=0
,我得到了相应的运行时错误),我唯一的假设就是在double类型中,a = 0实际上并不意味着 a是0 ,而是 a非常接近0 (显然,a> 0且不是负数,或它应该是-inf)。
即使a=0.0
和a=0.00000000
,我也会得到相同的结果。感觉像计算机一样决定计算这个表达式的极限(微积分式),但我想有一个更明智的解释。此外,我不清楚为什么它只是积极的,而不是消极的。
答案 0 :(得分:2)
您所看到的是正确的浮点除法。
值无穷大和负无穷大是有效的浮点值,以及&#34; not-a-number&#34;。
当使用0除数进行浮点除法时,结果将为无穷大,符号与被除数相符。
如果您要计算0.0/0.0
或inf/inf
,结果将为NaN
,即不是数字。
答案 1 :(得分:1)
C明确将此标识为未定义行为(UB)。
/
运算符的结果是商...如果第二个操作数的值为零,则行为未定义。 C11dr§6.5.55
C没有定义代码应该出错。
使用有限操作数的独占或符号的符号来指定无穷大的“值”是常见的结果。
匹配IEEE 754行为“divideByZero的默认结果应该是根据操作正确签名的∞:”C不要求遵守IEEE 754,尽管很多平台都在努力。
答案 2 :(得分:0)
在浮动或加倍中,允许除以零,结果为+-INF
或+-NAN
。