【问题标题】: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);

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

【问题讨论】:

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

标签: objective-c c crash floating-point


【解决方案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 指定除以零的结果。
        • 哦。那只是为了花车吗?
        猜你喜欢
        • 2011-06-11
        • 1970-01-01
        • 2019-03-12
        • 2020-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多