stringtranslate.com

Арифметическое переполнение

Термин «арифметическое истощение» (также «исчезновение чисел с плавающей точкой » или просто «исчезновение чисел» ) — это состояние в компьютерной программе , при котором результатом вычисления является число с более точным абсолютным значением, чем то, которое компьютер может фактически представить в памяти своего центрального процессора (ЦП).

Арифметическое переполнение может произойти, когда истинный результат операции с плавающей точкой меньше по величине (то есть ближе к нулю), чем наименьшее значение, представимое как обычное число с плавающей точкой в ​​целевом типе данных . [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 для потери значимости (а также других исключений) заключается в записи в виде состояния с плавающей точкой того, что произошло переполнение значимости. Это указано для уровня прикладного программирования, но часто также интерпретируется как способ обработки на аппаратном уровне.

Смотрите также

Ссылки

  1. ^ Кунен, Джером Т. (1980). «Руководство по внедрению предлагаемого стандарта для арифметики с плавающей точкой». Компьютер . 13 (1): 68–79. doi :10.1109/mc.1980.1653344. S2CID  206445847.
  2. ^ "CWE - CWE-191: Целочисленное переполнение (перенос или перенос) (3.1)". cwe.mitre.org .
  3. ^ «Переполнение и отсутствие заполненных типов данных в Java — DZone Java». dzone.com .
  4. Мир, Табиш (4 апреля 2017 г.). «Целочисленное переполнение/недополнение и неточность чисел с плавающей точкой». medium.com .
  5. ^ "Целочисленное переполнение и переполнение буфера при обработке метаданных MP4 в libstagefright". Mozilla .
  6. ^ «Предотвращение переполнений и потерь буфера». developer.apple.com .
  7. ^ Sun Microsystems (2005). Numerical Computation Guide. Oracle . Получено 21 апреля 2018 г.
  8. ^ Деммел, Джеймс (1984). «Underflow и надежность численного программного обеспечения». Журнал SIAM по научным и статистическим вычислениям . 5 (4): 887–919. doi :10.1137/0905062.
  9. ^ Хит, Майкл Т. (2002). Научные вычисления (Второе издание). Нью-Йорк: McGraw-Hill. С. 20. ISBN 0-07-239910-4.