将double数除以double的0表示表达式的限制,而不是错误

时间:2017-01-27 17:32:45

标签: c math double

我已经被问到这段代码的结果:

#include <stdio.h>
int main()

{

    double a =0;

    double b =2/ a;

    printf("b=%f\n", b);

    printf("SLABC\n");

    return 0;

} 

运行它,代码打印b=infSLABC,然后正确存在。

我无法理解为什么2/0的除法不会出现错误(如果它是int a=0,我得到了相应的运行时错误),我唯一的假设就是在double类型中,a = 0实际上并不意味着 a是0 ,而是 a非常接近0 (显然,a> 0且不是负数,或它应该是-inf)。

即使a=0.0a=0.00000000,我也会得到相同的结果。感觉像计算机一样决定计算这个表达式的极限(微积分式),但我想有一个更明智的解释。此外,我不清楚为什么它只是积极的,而不是消极的。

3 个答案:

答案 0 :(得分:2)

您所看到的是正确的浮点除法。

值无穷大和负无穷大是有效的浮点值,以及&#34; not-a-number&#34;。

当使用0除数进行浮点除法时,结果将为无穷大,符号与被除数相符。

如果您要计算0.0/0.0inf/inf,结果将为NaN,即不是数字。

答案 1 :(得分:1)

C明确将此标识为未定义行为(UB)。

  

/运算符的结果是商...如果第二个操作数的值为零,则行为未定义。 C11dr§6.5.55

C没有定义代码应该出错。

使用有限操作数的独占或符号的符号来指定无穷大的“值”是常见的结果。

匹配IEEE 754行为“divideByZero的默认结果应该是根据操作正确签名的∞:”C不要求遵守IEEE 754,尽管很多平台都在努力。

答案 2 :(得分:0)

浮动加倍中,允许除以零,结果为+-INF+-NAN