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

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

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

В IEEE 754-2008 128-битный формат base-2 официально называется двоичный128.

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

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

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

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

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

А двоичный256 будет иметь достоверную точность 237 бит (приблизительно 71 десятичную цифру) и смещение экспоненты 262143.

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

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

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

Сохраненные экспоненты 000016 и 7FFF16 интерпретируются специально.

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

Минимальное строго положительное (субнормальное) значение - 2−16494 ≈ 10−4965 и имеет точность всего один бит. Минимальное положительное нормальное значение - 2−163823.3621 × 10−4932 и имеет точность 113 бит, т.е. ± 2−16494 также. Максимальное представимое значение 216384 − 2162711.1897 × 104932.

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

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

0000 0000 0000 0000 0000 0000 0000 000116 = 2−16382 × 2−112 = 2−16494                                          ≈ 6.4751751194380251109244389582276465525 × 10−4966                                            (наименьшее положительное субнормальное число)
0000 ffff ffff ffff ffff ffff ffff ffff16 = 2−16382 × (1 − 2−112)                                          ≈ 3.3621031431120935062626778173217519551 × 10−4932                                            (наибольшее субнормальное число)
0001 0000 0000 0000 0000 0000 0000 000016 = 2−16382                                          ≈ 3.3621031431120935062626778173217526026 × 10−4932                                            (наименьшее положительное нормальное число)
7ffe ffff ffff ffff ffff ffff ffff ffff16 = 216383 × (2 − 2−112)                                          ≈ 1.1897314953572317650857593266280070162 × 104932                                            (наибольшее нормальное число)
3ffe ffff ffff ffff ffff ffff ffff ffff16 = 1 − 2−113                                          ≈ 0,9999999999999999999999999999999999037 (наибольшее число меньше единицы)
3fff 0000 0000 0000 0000 0000 0000 000016 = 1 (один)
3fff 0000 0000 0000 0000 0000 0000 000116 = 1 + 2−112                                          ≈ 1.0000000000000000000000000000000001926 (наименьшее число больше единицы)
c000 0000 0000 0000 0000 0000 0000 000016 = −2
0000 0000 0000 0000 0000 0000 0000 000016 = 08000 0000 0000 0000 0000 0000 0000 000016 = −0
7fff 0000 0000 0000 0000 0000 0000 000016 = бесконечность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 единица на последнем месте.

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

Распространенный программный метод для реализации почти четырехкратной точности с использованием пары из двойная точность ценности иногда называют двойная двойная арифметика.[4][5][6] Используя пары значений двойной точности IEEE с 53-битными значащими, арифметика двойного и двойного чисел может представлять операции как минимум с[4] 2 × 53 = 106-битное значение (на самом деле 107 бит[7] за исключением некоторых самых больших значений из-за ограниченного диапазона экспоненты), лишь немного менее точный, чем 113-битная мантисса четверной точности IEEE binary128. Диапазон двойного-двойного остается по существу таким же, как формат двойной точности, потому что показатель степени все еще имеет 11 бит,[4] значительно ниже 15-битной экспоненты четырехкратной точности IEEE (диапазон 1.8 × 10308 для дабл-дабл против 1.2 × 104932 для двоичного128).

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

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

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

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

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

Реализации

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

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

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

Четверная точность указана в Фортран посредством реальный (real128) (модуль iso_fortran_env из Fortran 2008 необходимо использовать константу реальный128 равно 16 на большинстве процессоров), или как реальный (selected_real_kind (33, 4931)), или нестандартным способом как РЕАЛЬНЫЙ * 16. (Четверная точность РЕАЛЬНЫЙ * 16 поддерживается Компилятор Intel Fortran[10] и по GNU Fortran компилятор[11] на x86, x86-64, и Itanium архитектуры, например.)

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

На x86 и x86-64 наиболее распространенные компиляторы C / C ++ реализуют длинный двойной как либо 80-битный повышенная точность (например, Компилятор GNU C gcc[13] и Компилятор Intel C ++ с / Клонг ‑ дабл выключатель[14]) или просто как синоним двойной точности (например, Microsoft Visual C ++[15]), а не как четырехкратная точность. Стандарт вызова процедуры для ARM 64-битная архитектура (AArch64) указывает, что длинный двойной соответствует формату четверной точности IEEE 754.[16] На некоторых других архитектурах некоторые компиляторы C / C ++ реализуют длинный двойной как четырехкратная точность, например gcc на PowerPC (как дабл-дабл[17][18][19]) и SPARC,[20] или Компиляторы Sun Studio на SPARC.[21] Даже если длинный двойной не является четырехкратной точностью, однако некоторые компиляторы C / C ++ предоставляют нестандартный тип четырехкратной точности в качестве расширения. Например, gcc предоставляет тип с четырехкратной точностью, называемый __float128 для x86, x86-64 и Itanium Процессоры,[22] и дальше PowerPC как IEEE 128-битные числа с плавающей запятой с использованием параметров -mfloat128-hardware или -mfloat128;[23] а некоторые версии компилятора Intel C / C ++ для x86 и x86-64 предоставляют нестандартный тип с четырехкратной точностью, называемый _Quad.[24]

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

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

Поддержка оборудования

В IBM была добавлена ​​четырехкратная точность IEEE. S / 390 G5 в 1998 году,[29] и поддерживается аппаратно в последующих z / Архитектура процессоры.[30][31] IBM МОЩНОСТЬ9 ЦПУ (Мощность ISA 3.0 ) имеет встроенную 128-битную аппаратную поддержку.[23]

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

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

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

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

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

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

  1. ^ Дэвид Х. Бейли; Джонатан М. Борвейн (6 июля 2009 г.). «Высокоточные вычисления и математическая физика» (PDF).
  2. ^ Хайэм, Николас (2002). «Разработка стабильных алгоритмов» в «Точность и стабильность численных алгоритмов» (2-е изд.). СИАМ. п. 43.
  3. ^ Уильям Кахан (1 октября 1987 г.). «Лекционные заметки о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF).
  4. ^ а б c d Йозо Хида, Х. Ли и Д. Х. Бейли, Quad-Double арифметика: алгоритмы, реализация и применение, Технический отчет Национальной лаборатории Лоуренса Беркли LBNL-46996 (2000). Также Y. Hida et al., Библиотека для арифметики double-double и quad-double (2007).
  5. ^ а б c Я. Р. Шевчук, Адаптивная точная арифметика с плавающей запятой и быстрые надежные геометрические предикаты, Дискретная и вычислительная геометрия 18: 305-363, 1997.
  6. ^ Кнут, Д. Э. Искусство программирования (2-е изд.). глава 4.2.3. проблема 9.
  7. ^ Роберт Мунафо Типы данных с плавающей запятой высокой точности F107 и F161 (2011).
  8. ^ 128-битный длинный двойной тип данных с плавающей запятой
  9. ^ sourceware.org Re: Состояние glibc libm
  10. ^ "Краткое описание компилятора Intel Fortran (архивная копия на web.archive.org)" (PDF). Вс. Архивировано 25 октября 2008 года.. Получено 2010-01-23.CS1 maint: неподходящий URL (связь)
  11. ^ «Серия выпусков GCC 4.6 - Изменения, новые функции и исправления». Получено 2010-02-06.
  12. ^ «ISO / IEC TS 18661-3» (PDF). 2015-06-10. Получено 2019-09-22.
  13. ^ Параметры i386 и x86-64 (архивная копия на web.archive.org), Использование коллекции компиляторов GNU.
  14. ^ Сайт разработчика Intel
  15. ^ Домашняя страница MSDN, о компиляторе Visual C ++
  16. ^ «Стандарт вызова процедур для 64-битной архитектуры ARM (AArch64)» (PDF). 2013-05-22. Архивировано из оригинал (PDF) на 2019-10-16. Получено 2019-09-22.
  17. ^ Опции RS / 6000 и PowerPC, Использование коллекции компиляторов GNU.
  18. ^ Внутри Macintosh - числовые значения PowerPC В архиве 9 октября 2012 г. Wayback Machine
  19. ^ 128-битные длинные подпрограммы двойной поддержки для Дарвина
  20. ^ Параметры SPARC, Использование коллекции компиляторов GNU.
  21. ^ Математические библиотеки, Sun Studio 11 Руководство по численным вычислениям (2005).
  22. ^ Дополнительные плавающие типы, Использование коллекции компиляторов GNU
  23. ^ а б «Серия выпусков GCC 6 - Изменения, новые функции и исправления». Получено 2016-09-13.
  24. ^ Форумы Intel C ++ (2007).
  25. ^ "Boost.Multiprecision - float128". Получено 2015-06-22.
  26. ^ Павел Голобородько (20.01.2013). «Быстрые вычисления с четырехкратной точностью в MATLAB». Получено 2015-06-22.
  27. ^ "DoubleDouble.jl".
  28. ^ "doubledouble.py".
  29. ^ Schwarz, E.M .; Крыговски, К. А. (сентябрь 1999 г.). "Устройство с плавающей запятой S / 390 G5". Журнал исследований и разработок IBM. 43 (5/6): 707–721. Дои:10.1147 / ряд 435.0707. Получено 10 октября, 2020.
  30. ^ Гервиг, Г., Веттер, Х., Шварц, Э. М., Хэсс, Дж., И Крыговски, К. А., Флейшер, Б. М. и Кроенер, М. (май 2004 г.). «Устройство с плавающей запятой IBM eServer z990. IBM J. Res. Dev. 48; стр. 311-322».CS1 maint: несколько имен: список авторов (связь)
  31. ^ Эрик Шварц (22 июня 2015 г.). «Ускорители IBM z13 SIMD для работы с целыми числами, строками и числами с плавающей запятой» (PDF). Получено 13 июля, 2015.
  32. ^ Разработчик поддерживает форматы двоичного обмена
  33. ^ Руководство по архитектуре SPARC: версия 8 (архивная копия на web.archive.org) (PDF). SPARC International, Inc. 1992. Архивировано с оригинал (PDF) на 2005-02-04. Получено 2011-09-24. SPARC - это архитектура набора команд (ISA) с 32-битным целым числом и 32-, 64- и 128-битными числами с плавающей запятой стандарта IEEE 754 в качестве основных типов данных.
  34. ^ Дэвид Л. Уивер; Том Жермонд, ред. (1994). Руководство по архитектуре SPARC: версия 9 (архивная копия на web.archive.org) (PDF). SPARC International, Inc. Архивировано с оригинал (PDF) на 2012-01-18. Получено 2011-09-24. Плавающая точка: архитектура предоставляет набор команд с плавающей запятой, совместимый с IEEE 754, работающий с отдельным файлом регистров, который обеспечивает 32 одинарной точности (32 бита), 32 двойной точности (64 бита), 16 квадратов точности. (128-битные) регистры или их смесь.
  35. ^ «Поведение и реализация SPARC». Руководство по численным вычислениям - Sun Studio 10. Sun Microsystems, Inc. 2004 г.. Получено 2011-09-24. Однако есть четыре ситуации, когда оборудование не может успешно выполнить инструкцию с плавающей запятой: ... Инструкция не реализуется на оборудовании (например, ... инструкции с точностью до четырех на любом FPU SPARC).
  36. ^ Падегс А. (1968). «Структурные аспекты System / 360 Model 85, III: Расширения архитектуры с плавающей запятой». Журнал IBM Systems. 7: 22–29. Дои:10.1147 / sj.71.0022.

внешняя ссылка