it-swarm.com.ru

 Несколько вещей о делении на ноль в C

Возможный дубликат:
Возвращаемое значение 1. # INF000

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

Однако сегодня я обнаружил (с помощью VC++ 2010 Express), что деление на 0 дает то, что называется 1. # INF000, и это должно быть положительной бесконечностью

Когда он был передан в функцию, он был передан как -1. # IND000

О чем это все?

Поиск 1. # INF000 и -1. # IND000 в Google также не дают четких объяснений.

Это что-то особенное для VC++?

18
user13267

Деление с плавающей точкой на ноль ведет себя иначе, чем целочисленное деление на ноль.

Стандарт IEEE с плавающей точкой различает + inf и -inf, в то время как целые числа не могут хранить бесконечность. Целочисленное деление на ноль приводит к неопределенному поведению. Деление с плавающей запятой на ноль определяется стандартом с плавающей запятой и приводит к + inf или -inf.

Правка:

Как указывает Лучиан, реализации C++ не обязаны следовать стандарту IEEE с плавающей запятой. Если используемая вами реализация не соответствует стандарту IEEE с плавающей запятой, результат деления с плавающей запятой на ноль не определен.

24
Klas Lindbäck

Правка: вопрос касается C++, а результат в C++ не определен, как четко указано в стандарте , а не IEEE или какой-либо другой объект, который фактически не регулирует язык C++. Стандарт делает. Реализации C++ могли бы следовать правилам IEEE, но в этом случае ясно, что поведение не определено.

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

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

Согласно стандарту C++:

5.6 Мультипликативные операторы

4) Двоичный/оператор дает частное, а двоичный% Оператор возвращает остаток от деления первого Выражение вторым. Если второй операнд/или% равен нулю, поведение не определено ; в противном случае (a/b) * b + a% b равно. Если оба операнда неотрицательны, то остаток неотрицателен; если нет, то знак остатка реализация defined79). (акцент мой)

12
Luchian Grigore

Цитируя последний проект стандарта ISO C++, раздел 5.6 ([expr.mul]):

Если второй операнд/или% равен нулю, поведение не определено.

Это относится как к целочисленному, так и к делению с плавающей точкой.

Конкретная реализация C++ может соответствовать стандарту IEEE с плавающей запятой , который имеет более конкретные требования для деления на ноль, и в этом случае поведение может быть четко определено для этой реализации. Вероятно, поэтому деление с плавающей точкой на ноль дает бесконечность в вашей реализации. Но стандарт C++ не требует поведения IEEE с плавающей точкой.

11
Keith Thompson

вы можете использовать следующий фрагмент кода в C . он выдает исключение. это работает на Linux Donno о Windows, хотя

#include <fenv.h>

#include <TRandom.h>
static void __attribute__ ((constructor)) trapfpe(void)
{
    /* Enable some exceptions. At startup all exceptions are masked. */
    feenableexcept(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW);
}
0
mkuse