Формат с плавающей запятой четверной точности - Quadruple-precision floating-point format

В вычислении , четверной точности (или четверной точности ) является двоичной плавающей точкой основанное компьютер номер формата , который занимает 16 байт (128 бит) с точностью по меньшей мере , в два раза 53-битной двойной точности .

Эта 128-битная четырехкратная точность разработана не только для приложений, требующих результатов с точностью выше двойной точности, но также в качестве основной функции позволяет более надежно и точно вычислять результаты с двойной точностью за счет минимизации ошибок переполнения и округления в промежуточных точках. расчеты и временные переменные. Уильям Кахан , главный разработчик оригинального стандарта с плавающей запятой IEEE-754, отметил: «На данный момент 10-байтовый расширенный формат представляет собой приемлемый компромисс между ценностью сверхточной арифметики и ценой ее реализации для быстрой работы; очень скоро два большее количество байтов точности станет допустимым, и, в конечном итоге, станет допустимым 16-байтовый формат ... Такая постепенная эволюция в сторону более широкой точности уже рассматривалась, когда был сформулирован стандарт IEEE 754 для арифметики с плавающей запятой ».

В стандарте IEEE 754-2008 128-битный формат base-2 официально упоминается как binary128 .

IEEE 754 двоичный формат с плавающей запятой четверной точности: binary128

Стандарт IEEE 754 определяет двоичный код 128 как имеющий:

Это дает точность от 33 до 36 десятичных знаков. Если десятичная строка с не более чем 33 значащими цифрами преобразована в представление с четырехкратной точностью IEEE 754, а затем преобразована обратно в десятичную строку с тем же количеством цифр, окончательный результат должен соответствовать исходной строке. Если число с четырехкратной точностью IEEE 754 преобразовано в десятичную строку, содержащую не менее 36 значащих цифр, а затем преобразовано обратно в представление с четырехкратной точностью, окончательный результат должен совпадать с исходным числом.

Формат записывается с неявным ведущим битом со значением 1, если показатель степени не хранится со всеми нулями. Таким образом, только 112 бит мантиссы появляются в формате памяти, но общая точность составляет 113 бит (приблизительно 34 десятичных знака: log 10 (2 113 ) ≈ 34,016 ). Биты выложены как:

Знаковый бит, 15-битная экспонента и 112-битная мантисса

Binary256 будет иметь точность мантиссы 237 битов (приблизительно 71 десятичных цифр) и показатель степени смещения 262143.

Экспонентное кодирование

Двоичная экспонента с плавающей запятой четверной точности кодируется с использованием двоичного представления смещения с нулевым смещением, равным 16383; это также известно как смещение экспоненты в стандарте IEEE 754.

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

Сохраненные экспоненты 0000 16 и 7FFF 16 интерпретируются особым образом.

Экспонента Значащий ноль Значащий и ненулевой Уравнение
0000 16 0 , -0 субнормальные числа (−1) знаковый бит × 2 −16382 × 0 знаковый бит 2
0001 16 , ..., 7FFE 16 нормализованное значение (−1) знаковый бит × 2 биты экспоненты 2 - 16383 × 1 значащие биты 2
7FFF 16 ± NaN (тихо, сигнализирует)

Минимальное строго положительное (субнормальное) значение составляет 2 −16494 ≈ 10 −4965 и имеет точность всего один бит. Минимальное положительное нормальное значение составляет 2 −163823,3621 × 10 −4932 и имеет точность 113 бит, то есть также ± 2 −16494 . Максимальное значение равно представима 2 16384 - 2 162711,1897 × 10 4932 .

Примеры четверной точности

Эти примеры даны в битовом представлении в шестнадцатеричном формате значения с плавающей запятой. Это включает знак, (смещенную) экспоненту и значащую.

0000 0000 0000 0000 0000 0000 0000 000116 = 2−16382 × 2−112 = 2−16494
                                          ≈ 6.4751751194380251109244389582276465525 × 10−4966
                                            (smallest positive subnormal number)
0000 ffff ffff ffff ffff ffff ffff ffff16 = 2−16382 × (1 − 2−112)
                                          ≈ 3.3621031431120935062626778173217519551 × 10−4932
                                            (largest subnormal number)
0001 0000 0000 0000 0000 0000 0000 000016 = 2−16382
                                          ≈ 3.3621031431120935062626778173217526026 × 10−4932
                                            (smallest positive normal number)
7ffe ffff ffff ffff ffff ffff ffff ffff16 = 216383 × (2 − 2−112)
                                          ≈ 1.1897314953572317650857593266280070162 × 104932
                                            (largest normal number)
3ffe ffff ffff ffff ffff ffff ffff ffff16 = 1 − 2−113
                                          ≈ 0.9999999999999999999999999999999999037
                                            (largest number less than one)
3fff 0000 0000 0000 0000 0000 0000 000016 = 1 (one)
3fff 0000 0000 0000 0000 0000 0000 000116 = 1 + 2−112
                                          ≈ 1.0000000000000000000000000000000001926
                                            (smallest number larger than one)
c000 0000 0000 0000 0000 0000 0000 000016 = −2
0000 0000 0000 0000 0000 0000 0000 000016 = 0
8000 0000 0000 0000 0000 0000 0000 000016 = −0
7fff 0000 0000 0000 0000 0000 0000 000016 = infinity
ffff 0000 0000 0000 0000 0000 0000 000016 = −infinity
4000 921f b544 42d1 8469 898c c517 01b816 ≈ π
3ffd 5555 5555 5555 5555 5555 5555 555516 ≈ 1/3

По умолчанию 1/3 округляется как двойная точность из-за нечетного числа бит в мантиссе. Таким образом, биты за точкой округления 0101...составляют менее 1/2 единицы в последнем месте .

Двойная двойная арифметика

Распространенный программный метод реализации почти четырехкратной точности с использованием пар значений двойной точности иногда называется арифметикой двойного двойного . Используя пары значений двойной точности IEEE с 53-битными манускриптами, двойная двойная арифметика обеспечивает операции с числами со значащими значениями не менее 2 × 53 = 106 бит (фактически 107 битов, за исключением некоторых из самых больших значений, из-за ограниченного показателя степени). range), лишь немного менее точный, чем 113-битное значение четырехкратной точности IEEE binary128. Диапазон двойного-двойного остается по существу таким же, как и формат двойной точности, потому что показатель степени все еще имеет 11 бит, что значительно ниже, чем 15-битный показатель степени 4-го числа IEEE (диапазон 1,8 × 10 308 для двойного-двойного по сравнению с 1,2 × 10 4932 для двоичного128).

В частности, дважды двойной / четверной значение точности д в двойной двойной техники представлена неявно в виде суммы ц = х + у двух двойной точности значений х и у , каждый из которых поставляет половину из ц «ы мантиссы . То есть пара ( x , y ) сохраняется вместо q , и операции над значениями q (+, -, ×, ...) преобразуются в эквивалентные (но более сложные) операции над значениями x и y . Таким образом, арифметика в этой технике сводится к последовательности операций с двойной точностью; Поскольку арифметика с двойной точностью обычно реализуется аппаратно, арифметика с двойной точностью обычно значительно быстрее, чем более общие арифметические методы с произвольной точностью .

Обратите внимание, что арифметика double-double имеет следующие особенности:

  • По мере уменьшения величины значения уменьшается и дополнительная точность. Следовательно, наименьшее число в нормализованном диапазоне уже двойной точности. Наименьшее число с полной точностью составляет 1000 ... 0 2 (106 нулей) × 2 −1074 , или 1.000 ... 0 2 (106 нулей) × 2 −968 . Числа, величина которых меньше 2 −1021 , не будут иметь дополнительной точности по сравнению с двойной точностью.
  • Фактическое количество бит точности может варьироваться. В общем, величина младшей части числа не превышает половины ULP старшей части. Если часть младшего разряда меньше половины ULP части высокого порядка, значимые биты (либо все нули, либо все единицы) подразумеваются между значащими числами высокого и низкого порядка. Некоторые алгоритмы, которые полагаются на фиксированное количество бит в мантиссе, могут дать сбой при использовании 128-битных длинных чисел двойной точности.
  • По вышеуказанной причине можно представить значения как 1 + 2 −1074 , что является наименьшим представимым числом больше 1.

В дополнение к арифметике double-double также возможно сгенерировать арифметику Triple-Double или Quad-Double, если требуется более высокая точность без какой-либо библиотеки с более высокой точностью с плавающей запятой. Они представлены как сумма трех (или четырех) значений двойной точности соответственно. Они могут представлять операции как минимум с 159/161 и 212/215 битами соответственно.

Аналогичный метод можно использовать для получения арифметики с двойным квадратом , которая представлена ​​как сумма двух значений с четверной точностью. Они могут представлять операции как минимум с 226 (или 227) битами.

Реализации

Четверная точность часто реализуется в программном обеспечении с помощью различных методов (таких как метод double-double выше, хотя этот метод не реализует четырехкратную точность IEEE), поскольку прямая аппаратная поддержка четырехкратной точности, по состоянию на 2016 год, менее распространена (см. « Аппаратная поддержка » ниже). Можно использовать общие арифметические библиотеки произвольной точности для получения четырехкратной (или более высокой) точности, но специализированные реализации с четырехкратной точностью могут обеспечить более высокую производительность.

Компьютерная языковая поддержка

Отдельный вопрос - насколько типы с четверной точностью напрямую включены в языки компьютерного программирования .

Четверная точность указывается в Fortran как real(real128)( iso_fortran_envнеобходимо использовать модуль из Fortran 2008, real128на большинстве процессоров константа равна 16), либо as real(selected_real_kind(33, 4931)), либо нестандартным образом as REAL*16. (Четверная точность REAL*16поддерживается компилятором Intel Fortran и компилятором GNU Fortran, например, на архитектурах x86 , x86-64 и Itanium .)

Для языка программирования C ISO / IEC TS 18661-3 (расширения с плавающей запятой для C, взаимозаменяемые и расширенные типы) определяет _Float128тип, реализующий формат четверной точности IEEE 754 (binary128). В качестве альтернативы, в C / C ++ с несколькими системами и компиляторами четырехкратная точность может быть указана с помощью типа long double , но это не требуется для языка (который требует только long doubleточности как минимум double), и это не является обычным явлением.

На x86 и x86-64 наиболее распространенные компиляторы C / C ++ реализуют long doubleлибо 80-битную расширенную точность (например, компилятор GNU C gcc и компилятор Intel C ++ с /Qlong‑doubleпереключателем), либо просто синоним двойной точности (например, Microsoft Visual C ++ ), а не с четырехкратной точностью. Стандарт вызова процедур для 64-битной архитектуры ARM (AArch64) указывает, что это long doubleсоответствует формату четверной точности IEEE 754. На некоторых других архитектурах некоторые компиляторы C / C ++ реализуют long doubleчетырехкратную точность, например, gcc на PowerPC (как double-double) и SPARC или компиляторы Sun Studio на SPARC. Однако даже если long doubleэто не четверная точность, некоторые компиляторы C / C ++ предоставляют нестандартный тип с четырехкратной точностью в качестве расширения. Например, gcc предоставляет тип с четырехкратной точностью, который называется __float128для процессоров x86, x86-64 и Itanium , а на PowerPC - как IEEE 128-битное число с плавающей запятой с использованием параметров -mfloat128-hardware или -mfloat128; а некоторые версии компилятора Intel C / C ++ для x86 и x86-64 предоставляют нестандартный тип с четырехкратной точностью, называемый _Quad.

Библиотеки и наборы инструментов

  • GCC четырехъядерный точности математической библиотеки, libquadmath , обеспечивает __float128и __complex128операции.
  • Подталкивания библиотеки Boost.Multiprecision multiprecision обеспечивает унифицированный интерфейс кросс-платформенного C ++ для __float128и _Quadтипов, и включает в себя пользовательскую реализацию стандартной математической библиотеки.
  • Набор инструментов Multiprecision Computing Toolbox для MATLAB позволяет выполнять вычисления с четырехкратной точностью в MATLAB . Он включает в себя базовые арифметические функции, а также численные методы, плотную и разреженную линейную алгебру.
  • Пакет DoubleFloats обеспечивает поддержку вычислений double-double для языка программирования Julia.
  • Библиотека doubledouble.py позволяет выполнять двойные вычисления в Python.
  • Mathematica поддерживает числа IEEE с четверной точностью: 128-битные значения с плавающей запятой (Real128) и 256-битные комплексные значения (Complex256).

Аппаратная поддержка

Четверная точность IEEE была добавлена ​​в IBM S / 390 G5 в 1998 году и поддерживается аппаратно в последующих процессорах z / Architecture . ЦП IBM POWER9 ( Power ISA 3.0 ) имеет встроенную 128-битную аппаратную поддержку.

Встроенная поддержка 128-битных чисел с плавающей запятой IEEE определена в PA-RISC 1.0 и в архитектурах SPARC V8 и V9 (например, имеется 16 регистров четверной точности% q0,% q4, ...), но ни один процессор SPARC не реализует четырехкратную прецизионные операции в оборудовании по состоянию на 2004 год.

Не-IEEE расширенная точность (128 бит памяти, 1 знаковый бит, 7 разрядов экспоненты, 112 дробных битов, 8 битов не используются) была добавлена ​​в серию IBM System / 370 (1970–1980-е годы) и была доступна на некоторых S / 360 модели 1960-х годов (S / 360-85, -195 и другие по специальному заказу или смоделированные программным обеспечением ОС).

Процессор VAX реализовал не-IEEE с плавающей запятой четверной точности в качестве своего формата «H с плавающей запятой». Он имел один знаковый бит, 15-битную экспоненту и 112-битные дроби, однако расположение в памяти значительно отличалось от четырехкратной точности IEEE, а также отличалось смещение экспоненты. Только некоторые из самых ранних процессоров VAX реализовывали H инструкции с плавающей точкой аппаратно, все остальные эмулировали H плавающую точку в программном обеспечении.

Архитектура RISC-V определяет расширение "Q" (четырехкратная точность) для 128-битных двоичных арифметических операций с плавающей запятой IEEE 754-2008. Расширение «L» (еще не сертифицированное) будет определять 64-битное и 128-битное десятичное число с плавающей запятой.

Аппаратную реализацию с четырехкратной точностью (128-битной) не следует путать с «128-битными FPU», которые реализуют инструкции SIMD , например Streaming SIMD Extensions или AltiVec , который относится к 128-битным векторам четырех 32-битных одинарной точности или два 64-битных значения двойной точности, которые обрабатываются одновременно.

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

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

внешние ссылки