Арифметическое опустошение
Термин «арифметическое опустошение» (также «недополнение с плавающей запятой » или просто «недополнение» ) — это условие в компьютерной программе , при котором результатом вычисления является число более точных абсолютных значений, чем компьютер может фактически представить в памяти своего центрального процессора (ЦП). ).
Арифметическое опустошение может произойти, когда истинный результат операции с плавающей запятой меньше по величине (то есть ближе к нулю), чем наименьшее значение, которое можно представить как обычное число с плавающей запятой в целевом типе данных . [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 обработка опустошения (а также других исключений) заключается в записи состояния с плавающей запятой о том, что произошло опустошение. Это указано для уровня прикладного программирования, но часто также интерпретируется как обработка на аппаратном уровне.
См. также
[ редактировать ]- Денормальное число
- Арифметика с плавающей запятой
- ИЭЭЭ 754
- Целочисленное переполнение
- Логарифмическая система счисления
- Машина эпсилон
- Нормальное число (вычисление)
Ссылки
[ редактировать ]- ^ Кунен, Джером Т. (1980). «Руководство по реализации предлагаемого стандарта арифметики с плавающей запятой». Компьютер . 13 (1): 68–79. дои : 10.1109/mc.1980.1653344 . S2CID 206445847 .
- ^ «CWE — CWE-191: Целочисленное опустошение (перенос или перенос) (3.1)» . cwe.mitre.org .
- ^ «Переполнение и потеря типов данных в Java — DZone Java» . dzone.com .
- ^ Мир, Табиш (4 апреля 2017 г.). «Целочисленное переполнение/недополнение и неточность чисел с плавающей запятой» . Medium.com .
- ^ «Целочисленное переполнение и переполнение буфера при обработке метаданных MP4 в libstagefright» . Мозилла .
- ^ «Предотвращение переполнения и опустошения буфера» . разработчик.apple.com .
- ^ Сан Микросистемы (2005). Руководство по численным вычислениям . Оракул . Проверено 21 апреля 2018 г.
- ^ Деммель, Джеймс (1984). «Недостаток и надежность числового программного обеспечения». Журнал SIAM по научным и статистическим вычислениям . 5 (4): 887–919. дои : 10.1137/0905062 .
- ^ Хит, Майкл Т. (2002). Научные вычисления (второе изд.). Нью-Йорк: МакГроу-Хилл. п. 20. ISBN 0-07-239910-4 .