为啥这不会崩溃?我不是在这里除以零吗?

Posted

技术标签:

【中文标题】为啥这不会崩溃?我不是在这里除以零吗?【英文标题】:Why doesn't this crash? Aren't I dividing by zero here?为什么这不会崩溃?我不是在这里除以零吗? 【发布时间】:2010-11-29 18:21:04 【问题描述】:

我得到了以两点为界的直线的斜率

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);

我没有得到除以零的错误。

【问题讨论】:

您似乎找到了除以零的方法。小心使用它,否则你可能会在时空中撕开一个洞,我们的世界将被无限吞没。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

因为它是未定义的行为。允许您的程序以任何方式运行,其中可能包括崩溃或向我们展示您因被零除而如此轻率地破坏的宇宙的最后一瞥。

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

/ 运算符的结果是 第一个除法的商 第二个操作数;的结果 % 运算符是余数。在 两种操作,如果 第二个操作数为零,行为 未定义。

【讨论】:

行为未定义,因为 OS X 编译器符合同一标准的附件 F。 C[99] 的 F.3.1 节说“+、-、* 和 / 运算符提供 IEC 60559 加、减、乘和除运算”,IEC60559/IEEE-754 指定除以零的结果。 哦。那只是为了花车吗?

以上是关于为啥这不会崩溃?我不是在这里除以零吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Eclipse 总是崩溃?

为啥这个 Ext.grid.Panel 会崩溃?

如果我不给它提供命令行参数,为啥我的程序会崩溃? [关闭]

我的应用程序不断崩溃,大概是因为空对象引用错误,但我不知道为啥

为啥 DatePicker 在 Date 变为 nil 时会崩溃? [复制]

我的程序崩溃了,我不知道为啥