Почему это не крушение? Разве я не делю на ноль здесь?
Я получаю наклон линии, ограниченной двумя точками
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:
Результатом оператора/является частное от деления первого операнд вторым; результат оператор% - остаток. В обе операции, если значение второй операнд равен нулю, поведение не определено.