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

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

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

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

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

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

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

Формат расширенной точности Microsoft MBF

Microsoft Basic порт для 6502 CPU, например, в адаптации , как Commodore BASIC , Applesoft BASIC , КИМ-1 BASIC или MicroTAN BASIC , поддерживает расширенный 40-битный вариант в формате с плавающей точкой Microsoft Binary Format (MBF) с 1977 года.

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

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

Процессоры IA32 , x86-64 и Itanium поддерживают 80-битный "двойной расширенный" формат повышенной точности с 64-битным значением. Intel 8087 по математике сопроцессор был первым x86 - устройство , которое поддерживает арифметику с плавающей точкой в аппаратных средств. Он был разработан для поддержки 32-битного формата «одинарной точности» и 64-битного формата «двойной точности» для кодирования и обмена числами с плавающей запятой. Временный реальный (расширенный) формат был разработан не для хранения данных с более высокой точностью как таковой, а в первую очередь для более надежного и точного вычисления двойных результатов за счет минимизации ошибок переполнения и округления в промежуточных вычислениях. Например, многие алгоритмы с плавающей запятой (например, возведение в степень ) страдают от значительной потери точности при вычислении с использованием наиболее прямых реализаций. Чтобы смягчить такие проблемы, внутренние регистры в 8087 были разработаны для хранения промежуточных результатов в 80-битном формате «расширенной точности». 8087 автоматически преобразует числа в этот формат при загрузке регистров с плавающей запятой из памяти, а также преобразует результаты обратно в более традиционные форматы при сохранении регистров обратно в память. Чтобы промежуточные результаты подвыражения сохранялись в временных переменных повышенной точности и продолжались в операторах языка программирования, а также для возобновления прерванных вычислений с того места, где они были прерваны, он предоставляет инструкции, которые передают значения между этими внутренними регистрами и памятью без выполнения какого-либо преобразования, что, следовательно, дает доступ к расширенному формату для вычислений - также поднимает вопрос о точности функций таких чисел, но с более высокой точностью.

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

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

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

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

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

Формат расширенной точности x86 - это 80-битный формат, впервые реализованный в математическом сопроцессоре Intel 8087 и поддерживаемый всеми процессорами, основанными на архитектуре x86, которые включают блок с плавающей запятой (FPU). Этот 80-битный формат использует один бит для знака мантиссы, 15 битов для поля экспоненты (т. Е. Тот же диапазон, что и у 128-битного формата IEEE 754 с четырехкратной точностью ) и 64 бита для мантиссы. Поле экспоненты смещено на 16383, что означает, что 16383 необходимо вычесть из значения в поле экспоненты, чтобы вычислить фактическую степень 2. Значение поля экспоненты 32767 (все пятнадцать битов 1 ) зарезервировано для обеспечения возможности представления. особых состояний, таких как бесконечность и не число . Если поле экспоненты равно нулю, значение является денормальным числом, а показатель степени 2 равен −16382.

X86 Extended Floating Point Format.svg

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

Интерпретация полей значения расширенной точности x86
Экспонента Значительный Имея в виду
Все нули Бит 63 Биты 62-0
Нуль Нуль Нуль. Знаковый бит дает знак нуля.
Ненулевой Денормальный. Значение (−1) s × m × 2 −16382.
Один Что-нибудь Псевдо-денормальный. 80387 и более поздние версии правильно интерпретируют это значение, но не генерируют его. Значение (−1) s × m × 2 −16382.
Все Биты 63,62 Биты 61-0
00 Нуль Псевдо-бесконечность. Знаковый бит дает знак бесконечности. 8087 и 80287 трактуют это как бесконечность. 80387 и более поздние версии обрабатывают это как недопустимый операнд.
Ненулевой Псевдо - не число. Знаковый бит не имеет смысла. 8087 и 80287 рассматривают это как сигнал, а не число. 80387 и более поздние версии обрабатывают это как недопустимый операнд.
01 Что-нибудь Псевдо - не число. Знаковый бит не имеет смысла. 8087 и 80287 рассматривают это как сигнал, а не число. 80387 и более поздние версии обрабатывают это как недопустимый операнд.
10 Нуль Бесконечность. Знаковый бит дает знак бесконечности. 8087 и 80287 рассматривают это как сигнал, а не число. Сопроцессоры 8087 и 80287 использовали представление псевдобесконечности для бесконечностей.
Ненулевой Сигнализация - это не число, знаковый бит не имеет смысла.
11 Нуль Неопределенный с плавающей запятой, результат неверных вычислений, таких как квадратный корень из отрицательного числа, логарифм отрицательного числа, 0/0, бесконечность / бесконечность, бесконечность, умноженная на 0, и другие, когда процессор был настроен так, чтобы не генерировать исключения для недопустимые операнды. Знаковый бит не имеет смысла. Это частный случай Тихого, а не числа.
Ненулевой Quiet Not a Number, знаковый бит не имеет смысла. 8087 и 80287 рассматривают это как сигнал, а не число.
Все остальные значения Бит 63 Биты 62-0
Нуль Что-нибудь Ненормально. Генерируется только на 8087 и 80287. 80387 и более поздние версии обрабатывают это как недопустимый операнд. Значение равно (−1) s × m × 2 e −16383.
Один Что-нибудь Нормализованное значение. Значение равно (−1) s × m × 2 e −16383.

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

  • Вычисления могут быть выполнены немного быстрее, если в регистре присутствуют все биты мантиссы.
  • 64-битное значение обеспечивает достаточную точность, чтобы избежать потери точности при преобразовании результатов обратно в формат с двойной точностью в огромном количестве случаев.
  • Этот формат предоставляет механизм для индикации потери точности из-за потери значимости, которая может быть перенесена с помощью дальнейших операций. Например, вычисление 2 × 10 −4930 × 3 × 10 −10 × 4 × 10 20 генерирует промежуточный результат 6 × 10 −4940, который является денормальным и также включает потерю точности. Произведение всех членов составляет 24 × 10 -4920, что может быть представлено как нормализованное число. 80287 может завершить этот расчет и указать потери точности, возвращая «аномальный» результат (экспоненту не 0, бит 63 = 0). Процессоры, начиная с 80387, больше не генерируют аномальные сигналы и не поддерживают нестандартные входные данные для операций. Они будут генерировать денормализацию, если происходит потеря значимости, но будут генерировать нормализованный результат, если последующие операции над денормализацией могут быть нормализованы.

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

80-битный формат с плавающей запятой был широко доступен к 1984 году после разработки C, Fortran и подобных компьютерных языков, которые первоначально предлагали только общие 32- и 64-битные размеры с плавающей запятой. В архитектуре x86 большинство компиляторов C теперь поддерживают 80-битную расширенную точность с помощью типа long double , и это было указано в стандартах C99 / C11 (арифметика с плавающей запятой IEC 60559 (Приложение F)). Компиляторы на x86 для других языков часто также поддерживают повышенную точность, иногда с помощью нестандартных расширений: например, Turbo Pascal предлагает extendedтип, а несколько компиляторов Fortran имеют REAL*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 значащей десятичной цифрой, а затем преобразовано обратно в двоичный формат, оно будет точно соответствовать оригиналу. Эти приближения вызывают особые затруднения при указании наилучшего значения для констант в формулах с высокой точностью, которые могут быть вычислены с помощью арифметики произвольной точности .

Потребность в 80-битном формате

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

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

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

где s - знак экспоненты (0 или 1), E - несмещенная экспонента, которая представляет собой целое число в диапазоне от 0 до 1023, а M - мантисса, которая представляет собой 53-битное значение, попадающее в диапазон 1. ≤ M <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 бит).

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

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

  • Некоторые реализации C / C ++ (например, GNU Compiler Collection (GCC), Clang , Intel C ++ ) реализуют long doubleиспользование 80-битных чисел с плавающей запятой в системах x86. Однако это поведение определяется реализацией и не требуется, но разрешено стандартом, как указано для оборудования IEEE 754 в стандарте C99 «Приложение F IEC 60559 арифметика с плавающей запятой». GCC также предоставляет __float80и __float128типы.
  • Некоторые реализации Common Lisp (например, CMU Common Lisp , Embeddable Common Lisp ) реализуют long-floatиспользование 80-битных чисел с плавающей запятой в системах x86.
  • Язык программирования D реализует realиспользование самого большого размера с плавающей запятой, реализованного на оборудовании, 80 бит для процессоров x86 или двойной точности, в зависимости от того, что больше.
  • Object Pascal ( Delphi ) имеет, помимо Single (32-бит) и Double (64-бит), расширенный (80-битный для традиционных 32-битных целей, хотя заполнение и платформа могут изменять размер ) тип.
  • Система времени выполнения Racket предоставляет 80-битный тип данных extflonum в системах x86.
  • Swift стандартная библиотека обеспечивает Float80тип данных.
  • PowerBASIC Компилятор BASIC обеспечивает EXTили EXTENDED10 байт расширенной точности с плавающей точкой типа данных.

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

Сноски

использованная литература