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

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

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

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

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

Что это значит?

Поиск 1. # INF000 и -1. # IND000 в google не предоставляют никаких ясных объяснений либо

Это что-то конкретное для VС++?

Ответы

Ответ 1

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

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

Edit:

Как указано Luchian, реализация С++ не обязана следовать стандарту IEEE Floating point. Если используемая вами реализация не соответствует стандарту IEEE Floating point, результат деления с плавающей запятой на ноль равен undefined.

Ответ 2

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

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

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

В соответствии со стандартом С++:

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

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

Ответ 3

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

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

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

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

Ответ 4

вы можете использовать следующий код sniplet в 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);
}