Почему это не крушение? Разве я не делю на ноль здесь?

Я получаю наклон линии, ограниченной двумя точками

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 вернет бесконечность и поднимет флаг деления на нуль.

Вы можете проверить эти условия, если вам нужно, используя функции isnan() и isinf(), определенные в math.h

Ответ 2

Деление на ноль ошибки происходит только для целочисленного деления. Для float обычно вы получаете бесконечность, если только дивиденд не равен нулю.

Ответ 3

Ошибки с плавающей запятой обычно не вызывают исключения.

Ответ 4

Потому что это Undefined Поведение. Вашей программе разрешено вести себя каким-либо образом, что может включать сбой или показ нам последнего взгляда на вселенную, которую вы так бесцеремонно уничтожили путем деления на ноль.

Из стандарта C [99], § 6.5.5.5:

Результатом оператора/является частное от деления первого операнд вторым; результат оператор% - остаток. В обе операции, если значение второй операнд равен нулю, поведение не определено.