为什么不崩溃?我不是在这里除以零吗?

时间:2009-09-19 18:00:39

标签: objective-c c crash floating-point

我得到一条由两点限制的线的斜率

float slopeXY(CGPoint p1, CGPoint p2)
{
    return ((p2.y - p1.y) / (p2.x - p1.x));
}

如果我给它一个零号线,

CGPoint p1 = CGPointMake(0, 10);
CGPoint p2 = CGPointMake(0, 10);

float sxy = slopeXY(p1, p2);

我没有得到零误差。

4 个答案:

答案 0 :(得分:29)

使用OS X上的默认浮点环境,浮点除以零不会导致陷阱或异常。 0.0 / 0.0将改为返回NaN并在fpscr中引发无效的浮点状态标志。将非零值除以0.0将返回无穷大并提高被零除标志。

如果需要,可以使用math.h中定义的isnan()和isinf()函数检查这些条件

答案 1 :(得分:5)

除以零错误仅发生整数除法。 对于浮动,通常你得到无穷大,除非被除数为零。

答案 2 :(得分:1)

浮点错误通常不会引发异常。

答案 3 :(得分:1)

因为它是未定义的行为。您的程序可以以任何方式运行,这可能包括崩溃或向我们展示您通过除零而无意中破坏的宇宙的最后一瞥。

来自C [99]标准,§6.5.5.5:

  

/运算符的结果是   来自第一部门的商   操作数由第二;的结果   %运算符是余数。在   两个操作,如果值的话   第二个操作数是零,行为   是未定的。