Формат с плавающей запятой четырехкратной точности
с плавающей запятой Форматы |
---|
ИЭЭЭ 754 |
|
Другой |
Альтернативы |
Разрядность архитектуры компьютера |
---|
Кусочек |
Приложение |
с плавающей запятой Двоичная точность |
с плавающей запятой Десятичная точность |
В вычислениях , который занимает 16 байт (128 бит) с точностью , четырехкратная точность (или четырехкратная точность ) — это двоичный плавающей запятой с компьютерный формат чисел по крайней мере, вдвое превышающей 53-битную двойную точность .
Эта 128-битная учетверенная точность предназначена не только для приложений, требующих результатов с точностью выше двойной. [1] но также, в качестве основной функции, обеспечить более надежное и точное вычисление результатов двойной точности за счет минимизации ошибок переполнения и округления в промежуточных вычислениях и чистых переменных. Уильям Кахан , главный архитектор первоначального стандарта чисел с плавающей запятой IEEE 754, отметил: «На данный момент 10-байтовый расширенный формат является приемлемым компромиссом между ценностью сверхточной арифметики и ценой ее реализации для обеспечения быстрой работы; очень скоро два больше байтов точности станет терпимым, и, в конечном итоге, 16-байтовый формат... Подобная постепенная эволюция в сторону большей точности уже рассматривалась, когда был разработан стандарт IEEE 754 для арифметики с плавающей запятой ». [2]
В IEEE 754-2008 -битный формат по основанию 2 официально называетсяbinary128 128 .
Двоичный формат с плавающей запятой четырехкратной точности IEEE 754:binary128
[ редактировать ]Стандарт IEEE 754 определяет двоичный файл 128 как имеющий:
- Знаковый бит : 1 бит
- Ширина экспоненты : 15 бит
- значащего числа Точность : 113 бит (112 хранятся явно)
Это дает точность от 33 до 36 значащих десятичных цифр. Если десятичная строка, содержащая не более 33 значащих цифр, преобразуется в формат четверной точности IEEE 754, давая нормальное число, а затем преобразуется обратно в десятичную строку с тем же количеством цифр, конечный результат должен соответствовать исходной строке. Если число IEEE 754 с четырехкратной точностью преобразуется в десятичную строку, содержащую не менее 36 значащих цифр, а затем преобразуется обратно в представление с четырехкратной точностью, конечный результат должен соответствовать исходному числу. [3]
Формат записывается с неявным ведущим битом со значением 1, если экспонента не хранится со всеми нулями. Таким образом, в формате памяти появляется только 112 бит мантиссы , но общая точность составляет 113 бит (приблизительно 34 десятичных цифры: log 10 (2 113 ) ≈ 34,016 ). Биты располагаются следующим образом:
Экспоненциальное кодирование
[ редактировать ]Двоичная экспонента с плавающей запятой четырехкратной точности кодируется с использованием двоичного представления смещения , при этом нулевое смещение равно 16383; это также известно как смещение экспоненты в стандарте IEEE 754.
- E min = 0001 16 − 3FFF 16 = −16382
- Е макс = 7FFE 16 − 3FFF 16 = 16383
- Смещение экспоненты = 3FFF 16 = 16383
Таким образом, как определено двоичным представлением смещения, чтобы получить истинный показатель степени, смещение 16383 необходимо вычесть из сохраненного показателя степени.
Сохраненные показатели степени 0000 16 и 7FFF 16 интерпретируются особым образом.
Экспонента | Значимый ноль | Значимое и ненулевое | Уравнение |
---|---|---|---|
0000 16 | 0 , −0 | субнормальные числа | (−1) знаковый бит × 2 −16382 × 0.значащие биты 2 |
0001 16 , ..., 7FFE 16 | нормализованное значение | (−1) знаковый бит × 2 биты экспоненты 2 – 16383 × 1.значимые биты 2 | |
7ФФФ 16 | ± ∞ | NaN (тихо, сигнализация) |
Минимальное строго положительное (субнормальное) значение составляет 2. −16494 ≈ 10 −4965 и имеет точность всего один бит. Минимальное положительное нормальное значение равно 2. −16382 ≈ 3.3621 × 10 −4932 и имеет точность 113 бит, т.е. ±2 −16494 также. Максимальное представимое значение равно 2. 16384 − 2 16271 ≈ 1.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 единицы на последнем месте .
Дабл-дабл арифметика
[ редактировать ]Распространенный программный метод реализации почти четырехкратной точности с использованием пар значений двойной точности иногда называют двойной арифметикой . [4] [5] [6] Используя пары значений двойной точности IEEE с 53-битными мантиссами, арифметика дабл-дабл обеспечивает операции с числами со мантиссами не менее [4] 2×53 = 106 бит (фактически 107 бит [7] за исключением некоторых самых больших значений из-за ограниченного диапазона экспоненты), лишь немного менее точно, чем 113-битная мантисса двоичной четверной точности IEEE128. Диапазон дабл-дабл остается по существу таким же, как и в формате двойной точности, поскольку экспонента по-прежнему имеет 11 бит. [4] значительно ниже, чем 15-битный показатель четверной точности IEEE (диапазон 1,8 × 10 308 для дабл-дабла против 1,2×10 4932 для двоичного файла128).
В частности, значение q двойной-двойной/четверной точности в методе double-double неявно представляется как сумма q = x + y двух значений двойной точности x и y , каждое из которых дает половину . мантиссы q . [5] То есть пара ( x , y ) сохраняется вместо q , а операции над q значениями (+, −, ×,...) преобразуются в эквивалентные (но более сложные) операции над значениями x и y . Таким образом, арифметика в этом методе сводится к последовательности операций двойной точности; поскольку арифметика двойной точности обычно реализуется аппаратно, арифметика двойной точности обычно выполняется значительно быстрее, чем более общие арифметические методы произвольной точности . [4] [5]
Обратите внимание, что арифметика дабл-дабл имеет следующие особенности: [8]
- По мере уменьшения величины значения степень дополнительной точности также уменьшается. Следовательно, наименьшее число в нормализованном диапазоне уже, чем двойная точность. Наименьшее число с полной точностью — 1000...0 2 (106 нулей) × 2. −1074 , или 1.000...0 2 (106 нулей) × 2 −968 . Числа, величина которых меньше 2 −1021 не будет иметь дополнительной точности по сравнению с двойной точностью.
- Фактическое количество бит точности может варьироваться. В общем случае величина младшей части числа не превышает половины ULP старшей части. Если младшая часть меньше половины ULP старшей части, между значащими числами старшего и младшего порядка подразумеваются значащие биты (либо все 0, либо все 1). Некоторые алгоритмы, которые полагаются на фиксированное количество битов в мантиссе, могут дать сбой при использовании 128-битных двойных чисел.
- По причине, указанной выше, можно представлять значения как 1 + 2. −1074 , которое является наименьшим представимым числом, большим 1.
В дополнение к арифметике дабл-дабл также возможно генерировать арифметику трипл-дабл или четверной дабл, если требуется более высокая точность без какой-либо библиотеки с плавающей запятой более высокой точности. Они представлены как сумма трех (или четырех) значений двойной точности соответственно. Они могут представлять операции минимум со 159/161 и 212/215 битами соответственно.
Подобный метод можно использовать для создания арифметики двойного квадрата , которая представляется как сумма двух значений четырехкратной точности. Они могут представлять операции длиной не менее 226 (или 227) бит. [9]
Реализации
[ редактировать ]Четверная точность часто реализуется в программном обеспечении с помощью различных методов (например, описанного выше метода дабл-дабл, хотя этот метод не реализует четверную точность IEEE), поскольку по состоянию на 2016 год прямая аппаратная поддержка четверной точности [update], реже (см. « Аппаратная поддержка » ниже). Можно использовать общие арифметические библиотеки произвольной точности для получения четырехкратной (или более высокой) точности, но специализированные реализации четырехкратной точности могут обеспечить более высокую производительность.
Компьютерная поддержка
[ редактировать ]Отдельный вопрос — в какой степени типы четырёхкратной точности непосредственно включены в языки компьютерного программирования .
точность определяется в Фортране Четверная 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 Compiler 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] ) и СПАРК , [20] или компиляторы Sun Studio на SPARC. [21] Даже если long double
не является четырехкратной точностью, однако некоторые компиляторы C/C++ предоставляют нестандартный тип четырехкратной точности в качестве расширения. Например, gcc предоставляет тип четырехкратной точности, называемый __float128
x86, x86-64 и Itanium , для процессоров [22] а на PowerPC как IEEE 128-битный формат с плавающей запятой с использованием опций -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]
Библиотеки и наборы инструментов
[ редактировать ]- четырехточечной Математическая библиотека GCC точности, libquadmath , предоставляет
__float128
и__complex128
операции. - Boost.Multiprecision Библиотека многоточности Boost предоставляет унифицированный кроссплатформенный интерфейс C++ для
__float128
и_Quad
типы и включает специальную реализацию стандартной математической библиотеки. [28] - Multiprecision Computing Toolbox для MATLAB позволяет выполнять вычисления с четырехкратной точностью в MATLAB . Он включает в себя базовые арифметические функции, а также численные методы, плотную и разреженную линейную алгебру. [29]
- Двойные поплавки [30] Пакет обеспечивает поддержку вычислений дабл-дабл для языка программирования Julia.
- Даблдабл.py [31] библиотека позволяет выполнять дабл-дабл вычисления в Python. [ нужна ссылка ]
- Mathematica поддерживает числа IEEE четверной точности: 128-битные значения с плавающей запятой (Real128) и 256-битные комплексные значения (Complex256). [ нужна ссылка ]
Аппаратная поддержка
[ редактировать ]Четверная точность 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, ...), но ни один процессор SPARC не реализует операции четырехточности на аппаратном уровне по состоянию на 2004 г. [update]. [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-битных значения двойной точности, которые обрабатываются одновременно.
См. также
[ редактировать ]- IEEE 754 , стандарт IEEE для арифметики с плавающей запятой.
- ISO/IEC 10967 , Независимая от языка арифметика
- Примитивный тип данных
- Обозначение Q (научное обозначение)
Ссылки
[ редактировать ]- ^ Дэвид Х. Бэйли; Джонатан М. Борвейн (6 июля 2009 г.). «Высокоточные вычисления и математическая физика» (PDF) .
- ^ Хайэм, Николас (2002). «Проектирование стабильных алгоритмов» в журнале «Точность и устойчивость численных алгоритмов» (2-е изд.) . СИАМ. п. 43.
- ^ Уильям Кахан (1 октября 1987 г.). «Конспекты лекций о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) .
- ^ Jump up to: Перейти обратно: а б с д Йозо Хида, К. Ли и Д. Х. Бэйли, Арифметика Quad-Double: алгоритмы, реализация и применение , Технический отчет Национальной лаборатории Лоуренса Беркли LBNL-46996 (2000). Также Ю. Хида и др., Библиотека для арифметики дабл-дабл и четверной дабл (2007).
- ^ Jump up to: Перейти обратно: а б с Дж. Р. Шевчук, Адаптивная точная арифметика с плавающей запятой и быстрые устойчивые геометрические предикаты , Дискретная и вычислительная геометрия 18: 305–363, 1997.
- ^ Кнут, Д.Э. Искусство компьютерного программирования (2-е изд.). глава 4.2.3. проблема 9.
- ^ Роберт Мунафо Высокоточные типы данных с плавающей запятой F107 и F161 (2011).
- ^ 128-битный длинный тип данных с двойной плавающей запятой
- ^ sourceware.org Re: Состояние glibc libm
- ^ «Краткое описание продукта компилятора Intel Fortran (архивная копия на web.archive.org)» (PDF) . Су. Архивировано из оригинала 25 октября 2008 года . Проверено 23 января 2010 г.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка ) - ^ «Серия выпусков GCC 4.6 — изменения, новые функции и исправления» . Проверено 6 февраля 2010 г.
- ^ «ИСО/МЭК TS 18661-3» (PDF) . 10.06.2015 . Проверено 22 сентября 2019 г.
- ^ Параметры i386 и x86-64 (архивная копия на web.archive.org) , Использование коллекции компиляторов GNU .
- ^ Сайт разработчика Intel
- ^ Домашняя страница MSDN, о компиляторе Visual C++.
- ^ «Стандарт вызова процедур для 64-битной архитектуры ARM (AArch64)» (PDF) . 22 мая 2013 г. Архивировано из оригинала (PDF) 16 октября 2019 г. Проверено 22 сентября 2019 г.
- ^ Опции RS/6000 и PowerPC , Использование коллекции компиляторов GNU .
- ^ Внутри Macintosh — числовые данные PowerPC. Архивировано 9 октября 2012 г., в Wayback Machine.
- ^ 128-битные длинные процедуры двойной поддержки для Дарвина
- ^ Параметры SPARC , Использование коллекции компиляторов GNU .
- ^ Математические библиотеки Sun Studio 11 , Руководство по численным вычислениям (2005).
- ^ Дополнительные плавающие типы , использование коллекции компилятора GNU.
- ^ Jump up to: Перейти обратно: а б «Серия выпусков GCC 6 — изменения, новые функции и исправления» . Проверено 13 сентября 2016 г.
- ^ Форумы Intel C++ (2007).
- ^ «Плывет» . ziglan.org . Проверено 7 января 2024 г.
- ^ «Основной репозиторий Carbon Language — Языковой дизайн» . Гитхаб . 09.08.2022 . Проверено 22 сентября 2022 г.
- ^ Кросс, Трэвис. «Проблема отслеживания для типов с плавающей запятой f16 и f128» . Гитхаб . Проверено 5 июля 2024 г.
- ^ «Boost.Multiprecision — float128» . Проверено 22 июня 2015 г.
- ^ Павел Голобородько (20 января 2013 г.). «Быстрые вычисления четырехкратной точности в MATLAB» . Проверено 22 июня 2015 г.
- ^ "DoubleFloats.jl" . Гитхаб .
- ^ "даблдабл.py" . Гитхаб .
- ^ Шварц, Э.М.; Крыговский, Калифорния (сентябрь 1999 г.). «Блок вычислений с плавающей запятой S / 390 G5». Журнал исследований и разработок IBM . 43 (5/6): 707–721. CiteSeerX 10.1.1.117.6711 . дои : 10.1147/рд.435.0707 .
- ^ Гервиг Г. и Веттер Х. и Шварц Э.М. и Хесс Дж. и Крыговский К.А. и Фляйшер Б.М. и Кронер М. (май 2004 г.). «Модуль вычислений с плавающей запятой IBM eServer z990. IBM J. Res. Dev. 48; стр. 311-322».
{{cite news}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ Эрик Шварц (22 июня 2015 г.). «Ускорители SIMD IBM z13 для целых, строк и чисел с плавающей запятой» (PDF) . Проверено 13 июля 2015 г.
- ^ «Поддержка разработчиком форматов двоичного обмена» . grouper.ieee.org . Архивировано из оригинала 27 октября 2017 г. Проверено 15 июля 2021 г.
- ^ Руководство по архитектуре SPARC: версия 8 (архивная копия на web.archive.org) (PDF) . SPARC International, Inc., 1992. Архивировано из оригинала (PDF) 4 февраля 2005 г. Проверено 24 сентября 2011 г.
SPARC — это архитектура набора команд (ISA) с 32-битным целым числом и 32-, 64- и 128-битным числом с плавающей запятой стандарта IEEE 754 в качестве основных типов данных.
- ^ Дэвид Л. Уивер; Том Джермонд, ред. (1994). Руководство по архитектуре SPARC: версия 9 (архивная копия на web.archive.org) (PDF) . SPARC International, Inc. Архивировано из оригинала (PDF) 18 января 2012 г. Проверено 24 сентября 2011 г.
Плавающая запятая: архитектура предоставляет набор команд с плавающей запятой, совместимый со стандартом IEEE 754, работающий с отдельным файлом регистров, который обеспечивает 32 команды одинарной точности (32 бита), 32 команды двойной точности (64 бита), 16 команд четырехкратной точности. (128-битные) регистры или их смесь.
- ^ «Поведение и реализация SPARC» . Руководство по численным вычислениям — Sun Studio 10 . Сан Микросистемс, Инк. 2004 г. Проверено 24 сентября 2011 г.
Однако есть четыре ситуации, когда аппаратное обеспечение не сможет успешно выполнить инструкцию с плавающей запятой: ... Инструкция не реализуется аппаратным обеспечением (например, ... инструкции четырехкратной точности на любом SPARC FPU).
- ^ Падегс А (1968). «Структурные аспекты System/360 Model 85, III: Расширения архитектуры с плавающей запятой». IBM Systems Journal . 7 : 22–29. дои : 10.1147/sj.71.0022 .
- ^ Справочное руководство по языку ассемблера Vector Engine , глава 4. Синтаксис ассемблера, стр. 23.
- ^ Руководство по архитектуре SX-Aurora TSUBASA, версия 1.1 (стр. 38, 60).
- ^ Спецификация RISC-V ISA, версия 20191213 , Глава 13, Стандартное расширение «Q» для чисел с плавающей запятой четырехточности, стр. 79.
- ^ [1] Глава 15 (с. 95).
Внешние ссылки
[ редактировать ]- Каталог высокоточного программного обеспечения
- QPFloat , бесплатная программная библиотека ( GPL ) для арифметических операций с четырехкратной точностью.
- HPALib , бесплатная программная библиотека ( LGPL ) для арифметических вычислений четырехкратной точности.
- libquadmath , математическая библиотека GCC четырехточечной точности.
- IEEE-754 Analysis , интерактивная веб-страница для изучения значений с плавающей запятой Binary32, Binary64 и Binary128.