Почему не происходит сбой? Разве я не делю на ноль здесь? - PullRequest
14 голосов
/ 19 сентября 2009

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

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 ]

29 голосов
/ 19 сентября 2009

При использовании среды с плавающей точкой по умолчанию в OS X деление с плавающей точкой на ноль не вызывает ловушку или исключение. 0.0 / 0.0 вместо этого вернет NaN и поднимет недопустимый флаг статуса с плавающей точкой в ​​fpscr. Деление ненулевого значения на 0.0 вернет бесконечность и повысит флаг деления на ноль.

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

5 голосов
/ 19 сентября 2009

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

1 голос
/ 20 сентября 2009

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

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

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

1 голос
/ 19 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...