stringtranslate.com

Повышенная точность

Расширенная точность относится к форматам чисел с плавающей запятой , которые обеспечивают большую точность , чем базовые форматы с плавающей запятой. [1] Форматы расширенной точности поддерживают базовый формат, сводя к минимуму ошибки округления и переполнения в промежуточных значениях выражений в базовом формате. В отличие от расширенной точности , арифметика произвольной точности относится к реализациям гораздо более крупных числовых типов (с количеством памяти, которое обычно не является степенью двойки) с использованием специального программного обеспечения (или, реже, аппаратного обеспечения).

Реализации повышенной точности

Существует долгая история расширенных форматов с плавающей запятой, уходящая корнями почти в середину прошлого века. Различные производители использовали разные форматы для повышения точности на разных машинах. Во многих случаях формат расширенной точности не совсем совпадает с увеличением обычных форматов одинарной и двойной точности, которые он призван расширить. В некоторых случаях реализация представляла собой просто программное изменение формата данных с плавающей запятой, но в большинстве случаев повышенная точность реализовывалась аппаратно, либо встроенное в сам центральный процессор , либо, что чаще, встроенное в аппаратное обеспечение какого-либо устройства. дополнительный подключенный процессор, называемый « блоком с плавающей запятой » (FPU) или «процессором с плавающей запятой» ( FPP ), доступный для ЦП как быстрое устройство ввода/вывода.

Расширенные прецизионные форматы IBM

IBM 1130 , проданный в 1965 году, [2] предлагал два формата с плавающей запятой: 32-битный формат «стандартной точности» и 40-битный формат «расширенной точности». Формат стандартной точности содержит 24-битное дополнение до двух , а расширенная точность использует 32-битное дополнение до двух. Последний формат полностью использует 32-битные целочисленные операции ЦП. Характеристикой обоих форматов является 8-битное поле, содержащее степень двойки, смещенную на 128. Арифметические операции с плавающей запятой выполняются программным обеспечением, а двойная точность вообще не поддерживается. Расширенный формат занимает три 16-битных слова, дополнительное пространство просто игнорируется. [3]

IBM System/360 поддерживает 32-битный «короткий» формат с плавающей запятой и 64-битный «длинный» формат с плавающей запятой. [4] В 360/85 и последующих версиях System/370 добавлена ​​поддержка 128-битного «расширенного» формата. [5] Эти форматы по-прежнему поддерживаются в текущей версии , где они теперь называются форматами « шестнадцатеричных чисел с плавающей запятой » (HFP).

Расширенный формат точности Microsoft MBF

Порт Microsoft BASIC для процессора 6502 , например, в таких адаптациях, как Commodore BASIC , AppleSoft BASIC , KIM-1 BASIC или MicroTAN BASIC, поддерживает расширенный 40-битный вариант формата Microsoft Binary Format (MBF) с плавающей запятой с 1977 года. [6]

Форматы расширенной точности IEEE 754

Стандарт IEEE 754 с плавающей запятой рекомендует, чтобы реализации обеспечивали форматы повышенной точности. Стандарт определяет минимальные требования для расширенного формата, но не определяет кодировку. [7] Кодировка выбирается разработчиком. [8]

Процессоры IA32 , x86-64 и Itanium поддерживают, безусловно, самый влиятельный формат в этом стандарте — 80-битный (64-битное значащее число) «двойной расширенный» формат Intel, описанный в следующем разделе .

Математические сопроцессоры Motorola 6888x и процессоры Motorola 68040 и 68060 поддерживают тот же самый 64-битный тип расширенной точности значащего и значащего чисел (аналогично формату Intel, но дополненный до 96-битного формата с 16 неиспользуемыми битами, вставленными между полями экспоненты и мантиссы [9] ). Последующие процессоры Coldfire не поддерживают этот 96-битный формат расширенной точности. [10]

Математический сопроцессор FPA10 для ранних процессоров ARM также поддерживает этот тип расширенной точности (аналогично формату Intel, но дополненный до 96-битного формата с 16 нулевыми битами, вставленными между полями знака и показателя степени), но без правильного округления. [11]

80-битные форматы x87 и Motorola 68881 соответствуют требованиям расширенного формата IEEE 754 [12] , как и 128-битный формат IEEE 754 .

расширенный формат точности x86

Формат расширенной точности x86 — это 80-битный формат, впервые реализованный в математическом сопроцессоре Intel 8087 и поддерживаемый всеми процессорами, основанными на конструкции x86 , включающими модуль с плавающей запятой (FPU).

Intel 8087 был первым устройством x86 , которое аппаратно поддерживало арифметику с плавающей запятой. Он был разработан для поддержки 32-битного формата «одинарной точности» и 64-битного формата «двойной точности» для кодирования и обмена числами с плавающей запятой. Расширенный формат был разработан не для хранения данных с более высокой точностью, а, скорее, для более надежного и точного вычисления временных двойных результатов за счет минимизации ошибок переполнения и округления в промежуточных вычислениях. [a] [14] [15] Все регистры с плавающей запятой в 8087 поддерживают этот формат, и он автоматически преобразует числа в этот формат при загрузке регистров из памяти , а также преобразует результаты обратно в более традиционные форматы при обратном сохранении регистров. в память. Чтобы обеспечить возможность сохранения результатов промежуточных подвыражений в рабочих переменных расширенной точности и продолжения их выполнения в операторах языка программирования, а также возобновления прерванных вычислений с того места, где они были прерваны, он предоставляет инструкции , которые передают значения между этими внутренними регистрами и памятью без выполнения какого-либо преобразования, что, следовательно, открывает доступ к расширенному формату вычислений [b] – также возрождая вопрос точности функций таких чисел, но с более высокой точностью.

Блоки с плавающей запятой (FPU) на всех последующих процессорах x86 поддерживали этот формат. В результате может быть разработано программное обеспечение, использующее преимущества более высокой точности, обеспечиваемой этим форматом. Уильям Кахан , главный разработчик арифметики x87 и первоначальный стандарт IEEE 754, отмечает разработку x87 с плавающей запятой: «Расширенный формат настолько широк, насколько мы осмелились (80 бит), был включен для выполнения той же вспомогательной роли, что и 13 внутренний десятичный формат используется в 10 десятичных калькуляторах Hewlett-Packard». [17] Более того, Кахан отмечает, что 64 бита были самой широкой мантиссой, в которой распространение переноса могло быть выполнено без увеличения времени цикла на 8087, [18] и что расширенная точность x87 была разработана для возможности расширения до более высокой точности в будущих процессорах. : «На данный момент 10-байтовый расширенный формат является приемлемым компромиссом между ценностью сверхточной арифметики и ценой ее реализации для быстрой работы; очень скоро еще два байта точности станут приемлемыми и, в конечном итоге, 16- байтовый формат . ... Подобная постепенная эволюция в сторону большей точности уже рассматривалась, когда был сформулирован стандарт IEEE 754 для арифметики с плавающей запятой ». [19]

В этом 80-битном формате используется один бит для знака мантиссы, 15 бит для поля показателя степени (т. е. тот же диапазон, что и в 128-битном формате четверной точности IEEE 754 ) и 64 бита для мантиссы. Поле экспоненты смещено на 16383, а это означает, что 16383 необходимо вычесть из значения в поле экспоненты, чтобы вычислить фактическую степень 2. [20] Значение поля экспоненты 32767 (все пятнадцать бит 1 ) зарезервировано, чтобы включить представление особых состояний, таких как бесконечность и Not a Number . Если поле показателя степени равно нулю, значение является денормальным числом, а показатель степени 2 равен -16382. [21]

В следующей таблице « s » — это значение знакового бита (0 означает положительное значение, 1 означает отрицательное значение), « e » — значение поля показателя степени, интерпретируемое как положительное целое число, а « m » — мантисса, интерпретируемая как положительное двоичное число, двоичная точка которого находится между битами 63 и 62. Поле « m » представляет собой комбинацию целой и дробной частей на диаграмме выше.

В отличие от форматов одинарной и двойной точности , этот формат не использует неявный/ скрытый бит . Скорее, бит 63 содержит целую часть мантиссы, а биты 62-0 содержат дробную часть. Бит 63 будет равен 1 для всех нормализованных чисел. Во время разработки 8087 эта конструкция имела несколько преимуществ :

Введение в использование

80-битный формат с плавающей запятой стал широко доступен к 1984 году, [25] после разработки C, Fortran и подобных компьютерных языков, которые первоначально предлагали только распространенные 32- и 64-битные размеры с плавающей запятой. В конструкции x86 большинство компиляторов C теперь поддерживают 80-битную расширенную точность посредством типа long double , и это было указано в стандартах C99 / C11 (арифметика с плавающей запятой IEC 60559 (Приложение F)). Компиляторы на x86 для других языков часто также поддерживают расширенную точность, иногда с помощью нестандартных расширений: например, Turbo Pascal предлагает Extendedтип, а некоторые компиляторы FortranREAL*10 имеют тип (аналог REAL*4и REAL*8). Такие компиляторы также обычно включают в свои стандартные библиотеки математические подпрограммы повышенной точности , такие как квадратный корень и тригонометрические функции .

Рабочий диапазон

80-битный формат с плавающей запятой имеет диапазон (включая субнормальные значения ) примерно от 3,65×10 −4951 до 1,18×10 4932 . Хотя log 10 (2 64 ) ≅ 19,266, этот формат обычно описывается как дающий приблизительно восемнадцать значащих цифр точности (нижний предел log 10 (2 63 ), минимальная гарантированная точность). Использование десятичных дробей при разговоре о двоичных числах неудачно, поскольку большинство десятичных дробей представляют собой повторяющиеся последовательности в двоичной системе, точно так же, как 2/3 в десятичной. Таким образом, такое значение, как 10,15, представляется в двоичном виде как эквивалент 10,1499996185 и т. д. в десятичном формате для REAL*4, но 10,15000000000000035527 и т. д. в REAL*8: взаимное преобразование будет включать аппроксимацию, за исключением тех нескольких десятичных дробей, которые представляют точное двоичное значение, например 0,625. Для REAL*10 десятичная строка равна 10,1499999999999999996530553 и т. д. Последние 9 цифр — это восемнадцатая дробная цифра и, следовательно, двадцатая значащая цифра строки. Границы преобразования десятичных и двоичных чисел для 80-битного формата могут быть заданы следующим образом: если десятичная строка, содержащая не более 18 значащих цифр, правильно округлена до 80-битного двоичного значения с плавающей запятой IEEE 754 (как на входе), то преобразуется обратно в то же количество значащих десятичных цифр (что и при выводе), тогда итоговая строка будет точно соответствовать оригиналу; в то время как, наоборот, если 80-битное двоичное значение с плавающей запятой IEEE 754 правильно преобразовано и (ближайшее) округлено до десятичной строки, содержащей не менее 21 значащей десятичной цифры, а затем преобразовано обратно в двоичный формат, оно будет точно соответствовать оригиналу. [12] Эти приближения особенно проблематичны при указании наилучшего значения констант в формулах с высокой точностью, которые могут быть рассчитаны с помощью арифметики произвольной точности .

Нужен 80-битный формат

Ярким примером необходимости иметь минимум 64 бита точности в мантиссе формата расширенной точности является необходимость избегать потери точности при возведении в степень значений двойной точности . [26] [27] [28] [c] Блоки вычислений с плавающей запятой x86 не предоставляют инструкции, которая непосредственно выполняет возведение в степень . Вместо этого они предоставляют набор инструкций, которые программа может последовательно использовать для возведения в степень с помощью уравнения:

Чтобы избежать потери точности, промежуточные результаты « log 2 ( x ) » и « y ·log 2 ( x ) » должны вычисляться с гораздо более высокой точностью, потому что эффективно и показатель степени, и поля мантиссы x должны вписываться в значимое поле промежуточного результата. Впоследствии поле мантиссы промежуточного результата разделяется между полями экспоненты и мантиссы конечного результата при вычислении 2 промежуточных результатов . Следующее обсуждение описывает это требование более подробно.

После небольшой распаковки значение двойной точности IEEE 754 можно представить как:

где s — знак показателя степени (0 или 1), E — несмещенный показатель степени, представляющий собой целое число в диапазоне от 0 до 1023, а M — мантисса, представляющая собой 53-битное значение, попадающее в диапазон 1. ≤ М < 2 . Отрицательные числа и ноль можно игнорировать, поскольку логарифм этих значений не определен. Для целей данного обсуждения M не имеет 53-битной точности, поскольку оно ограничено значением, превышающим или равным единице, т.е. скрытый бит не учитывается при определении точности (обратите внимание, что в ситуациях, когда M меньше 1, значение равно на самом деле это ненормально и, следовательно, возможно, уже произошла потеря точности. Эта ситуация выходит за рамки этой статьи).

Если взять журнал этого представления числа двойной точности и упростить его, получим следующее:

Этот результат показывает, что при логарифме числа по основанию 2 знак показателя исходного значения становится знаком логарифма, показатель степени исходного значения становится целой частью мантиссы логарифма, а мантисса исходное значение преобразуется в дробную часть мантиссы логарифма.

Поскольку E представляет собой целое число в диапазоне от 0 до 1023, для представления целой части логарифма необходимо до 10 бит слева от точки счисления. Поскольку M попадает в диапазон 1 ≤ M < 2 , значение log 2 M будет находиться в диапазоне 0 ≤ log 2 M < 1 , поэтому справа от точки счисления необходимо как минимум 52 бита для представления дробной части. логарифм. Объединение 10 бит слева от точки системы счисления с 52 битами справа от точки системы счисления означает, что значительная часть логарифма должна быть вычислена с точностью не менее 62 бит. На практике значения M менее требуют 53 бита справа от точки счисления, а значения M меньше требуют 54 бита справа от точки счисления, чтобы избежать потери точности. Уравновешивая это требование для дополнительной точности справа от точки счисления, показатели степени менее 512 требуют только 9 бит слева от точки счисления, а показатели степени менее 256 требуют только 8 бит слева от точки счисления.

Заключительная часть расчета возведения в степень — вычисление 2 промежуточных результатов . «Промежуточный результат» состоит из целой части « I », добавленной к дробной части « F ». Если промежуточный результат отрицательный, то необходима небольшая корректировка, чтобы получить положительную дробную часть, поскольку и « I », и « F » являются отрицательными числами.

Для положительных промежуточных результатов:

Для отрицательных промежуточных результатов:

Таким образом, целая часть промежуточного результата (« I » или « I −1 ») плюс смещение становится показателем степени конечного результата, а преобразованная положительная дробная часть промежуточного результата: 2 F или 2 1+ F становится мантиссой окончательный результат. Чтобы обеспечить 52-битную точность конечного результата, положительная дробная часть должна поддерживаться как минимум на уровне 52 бит.

В заключение, точное количество бит точности, необходимое для мантиссы промежуточного результата, в некоторой степени зависит от данных, но 64 бита достаточно, чтобы избежать потери точности в подавляющем большинстве вычислений возведения в степень , включающих числа двойной точности .

Количество битов, необходимое для экспоненты формата расширенной точности, следует из требования, чтобы произведение двух чисел двойной точности не переполнялось при вычислении с использованием расширенного формата. Наибольший возможный показатель значения двойной точности равен 1023, поэтому показатель наибольшего возможного произведения двух чисел двойной точности равен 2047 (11-битное значение). Добавление смещения для учета отрицательных показателей означает, что поле показателя должно иметь ширину не менее 12 бит.

Сочетание этих требований: 1 бит для знака, 12 бит для смещенной экспоненты и 64 бита для мантиссы означает, что для формата расширенной точности потребуется как минимум 77 бит. Инженерные соображения привели к окончательному определению 80-битного формата (в частности, стандарт IEEE 754 требует, чтобы диапазон экспонент расширенного формата точности соответствовал диапазону следующего по величине четырехкратного формата точности, который составляет 15 бит). [27]

Другим примером вычислений, в которых используется арифметика повышенной точности, являются итеративные схемы уточнения, используемые для косвенной очистки ошибок, накопленных в прямом решении во время, как правило, очень большого количества вычислений, выполняемых для числовой линейной алгебры. [30]

Языковая поддержка

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

Сноски

  1. ^ «Этот формат предназначен главным образом для того, чтобы помочь программистам повысить целостность их одинарного и двойного программного обеспечения, а также для уменьшения деградации из-за округления в вычислениях с двойной матрицей больших размеров, и его можно легко использовать таким образом, что замена расширенного четырехкратного никогда не следует лишать законной силы его использование». — дизайнер x87 В. Кахан [13]
  2. ^ «Языки высокого уровня будут использовать расширенные (невидимо) для оценки промежуточных подвыражений, а позже могут предоставлять расширенные как декларируемый тип данных». [16] : 70 
  3. ^ «Наличие как минимум такого же количества дополнительных бит точности в расширенном поле, как и в поле экспоненты базового формата, который он поддерживает, значительно упрощает точное вычисление трансцендентных функций, внутренних продуктов и степенной функции y x ». [29] : 70 

Рекомендации

  1. ^ IEEE 754 (2008, п. 2.1.21) определяет формат расширенной точности как «Формат, который расширяет поддерживаемый базовый формат, обеспечивая более высокую точность и диапазон».
  2. Фрэнсис, CG (11 февраля 1965 г.). «IBM представляет мощный маленький компьютер». Директор по информации (Пресс-релиз). Уайт-Плейнс, Нью-Йорк : Международная корпорация Business Machines (IBM). Архивировано из оригинала 5 июля 2019 г.
  3. ^ Библиотека подпрограмм (PDF) . IBM 1130 (9-е изд.). Корпорация IBM. 1974. с. 93.
  4. ^ Принципы работы . IBM System/360 (9-е изд.). Корпорация IBM. 1970. с. 41.
  5. ^ Принципы работы IBM System/370 (7-е изд.). Корпорация IBM. 1980. стр. 9-2–9-3.
  6. ^ Стейл, Майкл (20 октября 2008 г.). «Создайте свою версию Microsoft BASIC для 6502». pagetable.com . п. 46. ​​Архивировано из оригинала 30 мая 2016 г. Проверено 30 мая 2016 г.
  7. ^ Компьютерное общество IEEE (29 августа 2008 г.). Стандарт IEEE для арифметики с плавающей запятой (отчет). IEEE. §3.7. doi :10.1109/IEESTD.2008.4610935. ISBN 978-0-7381-5752-8. Стандарт IEEE 754-2008.
  8. ^ Брюэр, Кевин. «Отчет Кевина». Справочный материал IEEE-754 . Проверено 19 февраля 2012 г.
  9. ^ Семейство Motorola MC68000 (PDF) . Справочное руководство программиста. Свободный полупроводник. 1992. стр. 1–16.
  10. ^ Семейство ColdFire (PDF) . Справочное руководство программиста. Свободный полупроводник. 2005. с. 7-7.
  11. ^ «Паспорт данных FPA10» (PDF) . chrisacorns.computinghistory.org.uk . GEC Plessey Semiconductors. 11 июня 1993 года . Проверено 26 ноября 2020 г.
  12. ^ Аб Кахан, Уильям (1 октября 1997 г.). «Конспекты лекций о состоянии стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) .
  13. Кахан, Уильям (1 октября 1997 г.). «Конспекты лекций о состоянии стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . п. 5.
  14. ^ Эйнарссон, Бо (2005). Точность и надежность в научных вычислениях. СИАМ. стр. 9 и далее. ISBN 978-0-89871-815-7. Проверено 3 мая 2013 г.
  15. ^ «Архитектуры Intel 64 и IA-32» . Руководство разработчика программного обеспечения. Корпорация Intel, март 2012 г. §8.2.
  16. ^ Кунен, Джером Т. (январь 1980 г.). «Руководство по реализации предлагаемого стандарта арифметики с плавающей запятой». IEEE-компьютер . 13 : 68–79. дои : 10.1109/MC.1980.1653344. S2CID  206445847.
  17. Кахан, Уильям (22 ноября 1983 г.). «Математика, написанная песком — hp-15C, Intel 8087 и т. д.» (PDF) .
  18. ^ Голдберг, Дэвид (март 1991 г.). «Что каждый ученый-компьютерщик должен знать об арифметике с плавающей запятой» (PDF) . Обзоры вычислительной техники ACM . 23 (1): 192. дои : 10.1145/103162.103163. S2CID  222008826.
  19. ^ Хайэм, Николас (2002). «Проектирование устойчивых алгоритмов». Точность и устойчивость численных алгоритмов (2-е изд.). Общество промышленной и прикладной математики (SIAM). п. 43.
  20. ^ Техническое описание Intel 80C187
  21. ^ Руководство разработчика архитектур Intel 64 и IA-32: Том. 1. Корпорация Интел. стр. с 4–6 по 4–9 и с 4–18 по 4–21.
  22. ^ Палмер, Джон Ф.; Морс, Стивен П. (1984). Праймер 8087. Уайли Пресс. стр. 14. ISBN 0-471-87569-4.
  23. ^ Морс, Стивен П.; Альберт, Дуглас Дж. (1986). Архитектура 80286 . Уайли Пресс. стр. 91–111. ISBN 0-471-83185-9.
  24. ^ Руководство разработчика архитектур Intel 64 и IA-32: Том. 1. Корпорация Интел. стр. 8–21–8–22.
  25. Чарльз Северанс (20 февраля 1998 г.). «Интервью со стариком с плавающей запятой».
  26. ^ Палмер, Джон Ф.; Морс, Стивен П. (1984). Праймер 8087. Уайли Пресс. стр. 16. ISBN 0-471-87569-4.
  27. ^ аб Морс, Стивен П.; Альберт, Дуглас Дж. (1986). Архитектура 80286 . Уайли Пресс. стр. 96–98. ISBN 0-471-83185-9.
  28. ^ Хаф, Дэвид (март 1981 г.). «Применение предлагаемого стандарта IEEE 754 для арифметики с плавающей запятой». IEEE-компьютер . 14 (3): 70–74. дои : 10.1109/CM.1981.220381. S2CID  14645749.
  29. ^ Кунен, Джером Т. (январь 1980 г.). «Руководство по реализации предлагаемого стандарта арифметики с плавающей запятой». Компьютер IEEE : 68–79. дои : 10.1109/MC.1980.1653344. S2CID  206445847.
  30. ^ Деммель, Джеймс; Хида, Йозо; Кахан, Уильям ; Ли, Сяое С .; Мукерджи, Сонил; Риди, Э. Джейсон (июнь 2006 г.). «Границы ошибок в результате сверхточного итеративного уточнения» (PDF) . Транзакции ACM в математическом программном обеспечении . 32 (2): 325–351. дои : 10.1145/1141885.1141894. S2CID  1340891 . Проверено 18 апреля 2014 г.
  31. ^ «Плавающие типы (с использованием коллекции компиляторов GNU (GCC))» .
  32. ^ «Расширенный тип данных различается на разных платформах» .