stringtranslate.com

Формат с плавающей запятой четырехкратной точности

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

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

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

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

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

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

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

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

Экспоненциальное кодирование

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

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

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

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

Примеры четырехкратной точности

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

0000 0000 0000 0000 0000 0000 0000 0001 16 = 2 −16382 × 2 −112 = 2 −16494 ≈ 6,4751751194380251109244389582276465525 × 10 −4966 (наименьшее положительное субнормальное число)
0000 ffff ffff ffff ffff ffff ffff ffff 16 знак равно 2 -16382 × (1 - 2 -112 ) ≈ 3,3621031431120935062626778173217519551 × 10 −4932 (самое большое субнормальное число)
0001 0000 0000 0000 0000 0000 0000 0000 16 = 2 −16382 ≈ 3,3621031431120935062626778173217526026 × 10 −4932 (наименьшее положительное нормальное число)
7ffe ffff ffff ffff ffff ffff ffff ffff 16 знак равно 2 16383 × (2 - 2 -112 ) ≈ 1,1897314953572317650857593266280070162 × 10 4932 (самое большое нормальное число)
3ffe ffff ffff ffff ffff ffff ffff ffff 16 = 1 - 2 -113 ≈ 0,999999999999999999999999999999999999037 (наибольшее число меньше единицы)
3fff 0000 0000 0000 0000 0000 0000 0000 16 = 1 (один)
3fff 0000 0000 0000 0000 0000 0000 0001 16 = 1 + 2 −112 ≈ 1.0000000000000000000000000000000001926 (наименьшее число больше единицы)
c000 0000 0000 0000 0000 0000 0000 0000 16 = −2
0000 0000 0000 0000 0000 0000 0000 0000 16 = 08000 0000 0000 0000 0000 0000 0000 0000 16 = −0
7fff 0000 0000 0000 0000 0000 0000 0000 16 = бесконечностьffff 0000 0000 0000 0000 0000 0000 0000 16 = −бесконечность
4000 921f b544 42d1 8469 898c c517 01b8 16 ≈ π
3ffd 5555 5555 5555 5555 5555 5555 5555 16 ≈ 1/3

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

Дабл-дабл арифметика

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

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

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

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

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

Реализации

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

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

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

Четверная точность задается в Фортране (real(real128) необходимо использовать модуль iso_fortran_envиз Фортрана 2008, на большинстве процессоров константа real128равна 16), либо как real(selected_real_kind(33, 4931)), либо нестандартным образом как REAL*16. (Четырехкратная точность REAL*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++ с несколькими системами и компиляторами четырехкратная точность может быть указана с помощью типа long double , но это не требуется для языка (который требует только long doubleбыть по крайней мере столь же точным, как double), и не является это обычное дело.

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

Zig обеспечивает поддержку этого f128типа. [25]

В разрабатываемом языке Google Carbon предусмотрена его поддержка с типом под названием «f128». [26]

По состоянию на 2024 год Rust в настоящее время работает над добавлением нового f128типа для 128-битных чисел с плавающей точкой IEEE четырехкратной точности. [27]

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

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

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

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

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

Мэйнфреймы Siemens серий 7.700 и 7.500 и их преемники поддерживают те же форматы и инструкции с плавающей запятой, что и IBM System/360 и System/370 .

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

Архитектура NEC Vector Engine поддерживает сложение, вычитание, умножение и сравнение 128-битных двоичных чисел четверной точности IEEE 754. [40] Используются два соседних 64-битных регистра. В векторном регистре не поддерживается арифметика четырехкратной точности. [41]

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

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

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

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

  1. ^ Дэвид Х. Бейли; Джонатан М. Борвейн (6 июля 2009 г.). «Высокоточные вычисления и математическая физика» (PDF) .
  2. ^ Хайэм, Николас (2002). «Проектирование стабильных алгоритмов» в журнале «Точность и устойчивость численных алгоритмов» (2-е изд.) . СИАМ. п. 43.
  3. ^ Уильям Кахан (1 октября 1987 г.). «Конспекты лекций о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) .
  4. ^ abcd Йозо Хида, X. Ли и Д. Х. Бейли, Четырех-двойная арифметика: алгоритмы, реализация и применение, Технический отчет Национальной лаборатории Лоуренса Беркли LBNL-46996 (2000). Также Ю. Хида и др., Библиотека для арифметики дабл-дабл и четверной дабл (2007).
  5. ^ abc Дж. Р. Шевчук, Адаптивная точная арифметика с плавающей запятой и быстрые устойчивые геометрические предикаты, Дискретная и вычислительная геометрия 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 года . Проверено 23 января 2010 г.{{cite web}}: CS1 maint: unfit URL (link)
  11. ^ «Серия выпусков GCC 4.6 — изменения, новые функции и исправления» . Проверено 6 февраля 2010 г.
  12. ^ «ISO/IEC TS 18661-3» (PDF) . 10.06.2015 . Проверено 22 сентября 2019 г.
  13. ^ Параметры i386 и x86-64 (архивная копия на web.archive.org), Использование коллекции компиляторов GNU .
  14. ^ Сайт разработчика Intel
  15. ^ Домашняя страница MSDN, о компиляторе Visual C++.
  16. ^ «Стандарт вызова процедур для 64-битной архитектуры ARM (AArch64)» (PDF) . 22 мая 2013 г. Архивировано из оригинала (PDF) 16 октября 2019 г. Проверено 22 сентября 2019 г.
  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. ^ ab «Серия выпусков GCC 6 — изменения, новые функции и исправления» . Проверено 13 сентября 2016 г.
  24. ^ Форумы Intel C++ (2007).
  25. ^ «Плавает». ziglan.org . Проверено 7 января 2024 г.
  26. ^ «Основной репозиторий Carbon Language — Языковой дизайн» . Гитхаб . 09.08.2022 . Проверено 22 сентября 2022 г.
  27. ^ Кросс, Трэвис. «Проблема отслеживания для типов с плавающей запятой f16 и f128». Гитхаб . Проверено 5 июля 2024 г.
  28. ^ "Boost.Multiprecision - float128" . Проверено 22 июня 2015 г.
  29. ^ Павел Голобородько (20 января 2013 г.). «Быстрые вычисления четырехкратной точности в MATLAB» . Проверено 22 июня 2015 г.
  30. ^ "DoubleFloats.jl". Гитхаб .
  31. ^ "doubledouble.py". Гитхаб .
  32. ^ Шварц, EM; Крыговский, Калифорния (сентябрь 1999 г.). «Блок с плавающей запятой S / 390 G5». Журнал исследований и разработок IBM . 43 (5/6): 707–721. CiteSeerX 10.1.1.117.6711 . дои : 10.1147/rd.435.0707. 
  33. ^ Гервиг Г. и Веттер Х. и Шварц Э.М. и Хесс Дж. и Крыговский К.А. и Фляйшер Б.М. и Кронер М. (май 2004 г.). «Модуль вычислений с плавающей запятой IBM eServer z990. IBM J. Res. Dev. 48; стр. 311-322».{{cite news}}: CS1 maint: multiple names: authors list (link)
  34. Эрик Шварц (22 июня 2015 г.). «Ускорители SIMD IBM z13 для целых, строк и чисел с плавающей запятой» (PDF) . Проверено 13 июля 2015 г.
  35. ^ «Поддержка разработчиком форматов двоичного обмена» . grouper.ieee.org . Архивировано из оригинала 27 октября 2017 г. Проверено 15 июля 2021 г.
  36. ^ Руководство по архитектуре SPARC: Версия 8 (архивная копия на web.archive.org) (PDF) . SPARC International, Inc., 1992. Архивировано из оригинала (PDF) 4 февраля 2005 г. Проверено 24 сентября 2011 г. SPARC — это архитектура набора команд (ISA) с 32-битным целым числом и 32-, 64- и 128-битным числом с плавающей запятой стандарта IEEE 754 в качестве основных типов данных.
  37. ^ Дэвид Л. Уивер; Том Джермонд, ред. (1994). Руководство по архитектуре SPARC: версия 9 (архивная копия на web.archive.org) (PDF) . SPARC International, Inc. Архивировано из оригинала (PDF) 18 января 2012 г. Проверено 24 сентября 2011 г. С плавающей запятой: архитектура предоставляет набор команд с плавающей запятой, совместимый со стандартом IEEE 754, работающий с отдельным файлом регистров, который обеспечивает 32 команды одинарной точности (32 бита), 32 команды двойной точности (64 бита), 16 команд четырехкратной точности. (128-битные) регистры или их смесь.
  38. ^ «Поведение и реализация SPARC». Руководство по численным вычислениям — Sun Studio 10 . Сан Микросистемс, Инк. 2004 г. Проверено 24 сентября 2011 г. Однако есть четыре ситуации, когда аппаратное обеспечение не сможет успешно выполнить инструкцию с плавающей запятой: ... Инструкция не реализуется аппаратным обеспечением (например, ... инструкции четырехкратной точности на любом SPARC FPU).
  39. ^ Падегс А (1968). «Структурные аспекты System/360 Model 85, III: Расширения архитектуры с плавающей запятой». Системный журнал IBM . 7 : 22–29. дои : 10.1147/sj.71.0022.
  40. ^ Справочное руководство по языку ассемблера Vector Engine, глава 4. Синтаксис ассемблера, стр. 23.
  41. ^ Руководство по архитектуре SX-Aurora TSUBASA, версия 1.1 (стр. 38, 60).
  42. ^ Спецификация RISC-V ISA, версия 20191213, Глава 13, Стандартное расширение «Q» для чисел с плавающей запятой четырехточности, стр. 79.
  43. ^ [1] Глава 15 (с. 95).

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