﻿# Деление на ноль

## Определение

Деление на ноль \- логическая [программная ошибка](https://pvs-studio.ru/ru/blog/terms/0082/), зачастую приводящая к ошибке времени выполнения, которая заключается в  попытке деления любого числа на делитель, равный нулю\.

## Поведение программы

Возникновение ошибки времени выполнения зависит от многих факторов: как от языка и платформы разработки, так и от типа делимых чисел\. 

Согласно параграфу 5\.6 стандарта языка Си\+\+, если вторым операндом операторов "/" или "%" является 0, то в этом случае [поведение не определено](https://pvs-studio.ru/ru/blog/terms/0066/)\.

Попытка деления на целочисленный ноль на процессоре семейства x86 или x86\_64 приводит к возникновению аппаратного исключения \(по вектору 0\); соответственно программа на Си или Си\+\+, скомпилированная в машинный код, аварийно завершается при выполнении этого действия\. 

В то же время, если переменная, содержащая ноль, была вещественной \- согласно стандарту IEEE 754, результатом будет вещественное число "плюс бесконечность" или "минус бесконечность" \(согласно тому же стандарту, ноль также имеет знак\) в случае ненулевого числителя, и "не\-число" в случае неопределенности 0/0 \(компилятор Microsoft Visual C\+\+ возвращает специфичное для платформы x86 число "неопределенность"\)\.

Следует учитывать, что сама переменная не обязательно должна содержать именно 0\. Ноль может возникнуть при округлении, называемом исчезновением порядка \(arithmetic underflow\) \- когда в результате операции получается число, значением меньше машинной точности\. В таком случае результат считается равным 0\.

## Отслеживание деления на ноль

Ошибка деления ноль может отслеживаться некоторыми компиляторами \(например, Microsoft Visual C\+\+\) и [статическими анализаторами](https://pvs-studio.ru/ru/blog/terms/0074/)\.

Особенно внимательно надо быть при делении на переменную\-итератор цикла\. Легко можно упустить из виду, что итератор в какой\-то момент проходить через нулевое значение\. Для этого в статическом анализаторе может быть использована специальная диагностика \(например, [V609](https://pvs-studio.ru/ru/docs/warnings/v609/) в анализаторе PVS\-Studio\)\.

## Библиографический список

1. Wikipedia\. [Division by zero\.](https://en.wikipedia.org/wiki/Division_by_zero)
1. IEEE\. IEEE Standard for Floating\-Point Arithmetic \(IEEE 754\)\.
1. MSDN\. [Know Your Bugs: Three Kinds of Programming Errors](https://msdn.microsoft.com/en-us/library/s9ek7a19(v=vs.90).aspx)
1. RSDN\. [Как перехватить исключение в случае деления на нуль](http://rsdn.org/forum/cpp/2098430.flat)\.
1. [Перехват сообщений SIGSEGV \(Segmentation Fault\) и SIGFPE \(Floating point exception\)](http://galiego710.blogspot.com/2011/12/sigsegv-segmentation-fault-sigfpe.html)\.