Термин «арифметическое истощение» (также «исчезновение чисел с плавающей точкой » или просто «исчезновение чисел» ) — это состояние в компьютерной программе , при котором результатом вычисления является число с более точным абсолютным значением, чем то, которое компьютер может фактически представить в памяти своего центрального процессора (ЦП).
Арифметическое переполнение может произойти, когда истинный результат операции с плавающей точкой меньше по величине (то есть ближе к нулю), чем наименьшее значение, представимое как обычное число с плавающей точкой в целевом типе данных . [1] Переполнение может частично рассматриваться как отрицательное переполнение показателя степени значения с плавающей точкой. Например, если показатель степени может представлять значения от −128 до 127, то результат со значением меньше −128 может вызвать переполнение.
Для целых чисел термин «целочисленное переполнение» обычно относится к особому виду целочисленного переполнения или целочисленного циклического состояния, при котором результат вычитания приводит к значению, меньшему минимально допустимого для данного целочисленного типа, т. е. идеальный результат был бы ближе к отрицательной бесконечности, чем представимое значение выходного типа, ближайшее к отрицательной бесконечности. [2] [3] [4] [5] [6]
Интервал между − нулем и fminN , где fminN — наименьшее положительное нормальное значение с плавающей точкой, называется зазором потери значимости. Это происходит потому, что размер этого интервала на много порядков больше, чем расстояние между соседними нормальными значениями с плавающей точкой сразу за зазором. Например, если тип данных с плавающей точкой может представлять 20 бит , зазор потери значимости в 2 21 раз больше, чем абсолютное расстояние между соседними значениями с плавающей точкой сразу за зазором. [7]
В старых конструкциях зазор подзарядки имел только одно полезное значение — ноль. Когда происходила подзарядка, истинный результат заменялся нулем (либо непосредственно аппаратным обеспечением, либо системным программным обеспечением, обрабатывающим первичное состояние подзарядки). Такая замена называется «сбросом в ноль».
В издании IEEE 754 1984 года были введены субнормальные числа . Субнормальные числа (включая ноль) заполняют зазор под загрузкой значениями, где абсолютное расстояние между соседними значениями такое же, как и для соседних значений сразу за зазором под загрузкой. Это позволяет использовать «постепенную под загрузкой», когда используется ближайшее субнормальное значение, так же как и ближайшее нормальное значение, когда это возможно. Даже при использовании постепенной под загрузкой ближайшее значение может быть равно нулю. [8]
Абсолютное расстояние между соседними значениями с плавающей точкой сразу за зазором называется машинным эпсилоном , обычно характеризующимся наибольшим значением, сумма которого со значением 1 даст ответ со значением 1 в этой схеме с плавающей точкой. [9] Это можно записать как , где — функция, которая преобразует действительное значение в представление с плавающей точкой. Хотя машинный эпсилон не следует путать с уровнем потери значимости (предполагая субнормальные числа), они тесно связаны. Машинный эпсилон зависит от количества бит, которые составляют мантиссу , тогда как уровень потери значимости зависит от количества цифр, которые составляют поле экспоненты. В большинстве систем с плавающей точкой уровень потери значимости меньше машинного эпсилона.
Возникновение переполнения может привести к установке бита состояния («липкого»), возникновению исключения, генерации прерывания на аппаратном уровне или вызвать некоторую комбинацию этих эффектов.
Как указано в IEEE 754 , состояние потери значимости сигнализируется только в том случае, если также происходит потеря точности. Обычно это определяется как неточный конечный результат. Однако, если пользователь зацикливается на потере значимости, это может произойти независимо от учета потери точности. Обработка по умолчанию в IEEE 754 для потери значимости (а также других исключений) заключается в записи в виде состояния с плавающей точкой того, что произошло переполнение значимости. Это указано для уровня прикладного программирования, но часто также интерпретируется как способ обработки на аппаратном уровне.