Несколько вещей о делении на ноль в 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);
}