В вычислении , четверной точности (или четверной точности ) является двоичной плавающей точкой основанное компьютер номер формата , который занимает 16 байт (128 бит) с точностью по меньшей мере , в два раза 53-битной двойной точности .
Эта 128-битная четырехкратная точность разработана не только для приложений, требующих результатов с точностью выше двойной точности [1], но также в качестве основной функции позволяет более надежно и точно вычислять результаты с двойной точностью за счет минимизации переполнения и округления. ошибки в промежуточных расчетах и временные переменные. Уильям Кахан , главный архитектор оригинального стандарта с плавающей запятой IEEE-754, отметил: «На данный момент 10-байтовый расширенный форматэто приемлемый компромисс между ценностью сверхточной арифметики и ценой ее реализации для быстрой работы; очень скоро еще два байта точности станут допустимыми, и в конечном итоге станет допустимым 16-байтовый формат ... Такая постепенная эволюция в сторону более широкой точности уже рассматривалась, когда был сформулирован стандарт IEEE 754 для арифметики с плавающей точкой » [2]
В стандарте IEEE 754-2008 128-битный формат base-2 официально упоминается как binary128 .
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 ). Биты выложены как:
Binary256 будет иметь точность мантиссы 237 битов (приблизительно 71 десятичных цифр) и показатель степени смещения 262143.
Экспонентное кодирование
Двоичная экспонента с плавающей запятой четверной точности кодируется с использованием двоичного представления смещения с нулевым смещением, равным 16383; это также известно как смещение экспоненты в стандарте IEEE 754.
- E мин. = 0001 16 - 3FFF 16 = −16382
- E макс = 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 | |
7FFF 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 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,9999999999999999999999999999999999037 (наибольшее число меньше единицы)
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-битная мантисса четверной точности IEEE binary128. Диапазон двойного-двойного остается по существу таким же, как и формат двойной точности, потому что показатель степени все еще имеет 11 бит, [4] значительно ниже, чем 15-битный показатель степени четверной точности IEEE (диапазон 1,8 × 10 308 для двойной точности). -double по сравнению с 1,2 × 10 4932 для двоичного128).
В частности, дважды двойной / четверной значение точности д в двойной двойной техники представлена неявно в виде суммы ц = х + у двух двойной точности значений х и у , каждый из которых поставляет половину из ц «ы мантиссы . [5] То есть пара ( x , y ) сохраняется вместо q , и операции над значениями q (+, -, ×, ...) преобразуются в эквивалентные (но более сложные) операции над x и значения y . Таким образом, арифметика в этом методе сводится к последовательности операций с двойной точностью; Поскольку арифметика с двойной точностью обычно реализуется аппаратно, арифметика с двойной точностью обычно значительно быстрее, чем более общие арифметические методы с произвольной точностью . [4] [5]
Обратите внимание, что арифметика double-double имеет следующие особенности: [8]
- По мере уменьшения величины значения уменьшается и дополнительная точность. Следовательно, наименьшее число в нормализованном диапазоне уже двойной точности. Наименьшее число с полной точностью составляет 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) битами. [9]
Реализации
Четверная точность часто реализуется в программном обеспечении с помощью различных методов (таких как метод 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 [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 (как double-double [17] [18] [19] ) и SPARC , [20] или компиляторы Sun Studio на SPARC. [21] Однако даже если long double
это не четверная точность, некоторые компиляторы C / C ++ предоставляют нестандартный тип с четырехкратной точностью в качестве расширения. Так , например, GCC обеспечивает тип четверной точности под названием __float128
для x86, x86-64 и Itanium процессоров, [22] и на PowerPC , как IEEE 128-бит с плавающей точкой с использованием -mfloat128-аппаратных средств или -mfloat128 вариантов; [23] и некоторые версии компилятора Intel C / C ++ для x86 и x86-64 предоставляют нестандартный тип с четырехкратной точностью, называемый _Quad
. [24]
Библиотеки и наборы инструментов
- GCC четырехъядерный точности математической библиотеки, libquadmath , обеспечивает
__float128
и__complex128
операции. - Подталкивания библиотеки Boost.Multiprecision multiprecision обеспечивает унифицированный интерфейс кросс-платформенного C ++ для
__float128
и_Quad
типов, и включает в себя пользовательскую реализацию стандартной математической библиотеки. [25] - Набор инструментов Multiprecision Computing Toolbox для MATLAB позволяет выполнять вычисления с четырехкратной точностью в MATLAB . Он включает в себя базовые арифметические функции, а также численные методы, плотную и разреженную линейную алгебру. [26]
- Пакет DoubleDouble [27] обеспечивает поддержку вычислений double-double для языка программирования Julia.
- Библиотека doubledouble.py [28] позволяет выполнять двойные вычисления в Python.
- Mathematica поддерживает числа IEEE с четверной точностью: 128-битные значения с плавающей запятой (Real128) и 256-битные комплексные значения (Complex256). [ необходима цитата ]
Аппаратная поддержка
Четверная точность IEEE была добавлена в IBM S / 390 G5 в 1998 году [29] и поддерживается аппаратно в последующих процессорах z / Architecture . [30] [31] ЦП IBM POWER9 ( Power ISA 3.0 ) имеет встроенную 128-битную аппаратную поддержку. [23]
Встроенная поддержка 128-битных чисел с плавающей запятой IEEE определена в PA-RISC 1.0, [32] и в архитектурах SPARC V8 [33] и V9 [34] (например, имеется 16 регистров четверной точности% q0,% q4, ... ), но по состоянию на 2004 год ни один процессор SPARC не реализует аппаратные операции с четырехкратной точностью.[Обновить]. [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 плавающую точку в программном обеспечении.
Архитектура RISC-V определяет расширение «Q» (четырехкратная точность) для 128-битных двоичных арифметических операций с плавающей запятой IEEE 754-2008. [37] Расширение «L» (еще не сертифицированное) будет определять 64-битное и 128-битное десятичное число с плавающей запятой. [38]
Аппаратную реализацию с четырехкратной точностью (128-битной) не следует путать с «128-битными FPU», реализующими инструкции SIMD , такими как Streaming SIMD Extensions или AltiVec , который относится к 128-битным векторам четырех 32-битных одинарной точности или два 64-битных значения двойной точности, которые обрабатываются одновременно.
Смотрите также
- IEEE 754 , стандарт IEEE для арифметики с плавающей запятой
- ISO / IEC 10967 , Арифметика , не зависящая от языка
- Примитивный тип данных
Рекомендации
- ^ Дэвид Х. Бейли; Джонатан М. Борвейн (6 июля 2009 г.). «Высокоточные вычисления и математическая физика» (PDF) .
- ^ Хайэм, Николас (2002). «Разработка стабильных алгоритмов» в «Точность и стабильность численных алгоритмов» (2-е изд.) . СИАМ. п. 43.
- ^ Уильям Кахан (1 октября 1987 г.). «Лекционные заметки о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) .
- ^ a b c d Йозо Хида, X. Ли и Д.Х. Бейли, Четырехдвойная арифметика: алгоритмы, реализация и применение , Технический отчет Национальной лаборатории Лоуренса Беркли LBNL-46996 (2000). Также Y. Hida et al., Библиотека для арифметики двойных-двойных и четверных-двойных (2007).
- ^ a b c Дж. Р. Шевчук, Адаптивная точная арифметика с плавающей запятой и быстрые робастные геометрические предикаты , Дискретная и вычислительная геометрия 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 .CS1 maint: неподходящий URL ( ссылка )
- ^ «Серия выпусков GCC 4.6 - Изменения, новые функции и исправления» . Проверено 6 февраля 2010 .
- ^ «ISO / IEC TS 18661-3» (PDF) . 2015-06-10 . Проверено 22 сентября 2019 .
- ^ Параметры i386 и x86-64 (архивная копия на web.archive.org) , Использование коллекции компиляторов GNU .
- ^ Сайт разработчиков Intel
- ^ Домашняя страница MSDN, о компиляторе Visual C ++
- ^ «Стандарт вызова процедур для 64-битной архитектуры ARM (AArch64)» (PDF) . 2013-05-22. Архивировано из оригинального (PDF) 16.10.2019 . Проверено 22 сентября 2019 .
- ^ Параметры RS / 6000 и PowerPC , Использование коллекции компиляторов GNU .
- ^ Внутри Macintosh - PowerPC Числовые архивации 9 октября 2012, в Wayback Machine
- ^ 128-битные длинные подпрограммы двойной поддержки для Дарвина
- ^ Параметры SPARC , Использование коллекции компиляторов GNU .
- ^ Математические библиотеки , Sun Studio 11 Руководство по численным вычислениям (2005).
- ^ Дополнительные Плавающий Типы , Использование GNU Compiler Collection
- ^ а б «Серия выпусков GCC 6 - изменения, новые функции и исправления» . Проверено 13 сентября 2016 .
- ^ Форумы Intel C ++ (2007).
- ^ «Boost.Multiprecision - float128» . Проверено 22 июня 2015 .
- ^ Павел Голобородько (20.01.2013). «Быстрые вычисления с четырехкратной точностью в MATLAB» . Проверено 22 июня 2015 .
- ^ "DoubleDouble.jl" .
- ^ "doubledouble.py" .
- ^ Schwarz, EM; Крыговский, Калифорния (сентябрь 1999 г.). «Устройство с плавающей запятой S / 390 G5» . Журнал исследований и разработок IBM . 43 (5/6): 707–721. DOI : 10.1147 / rd.435.0707 . Проверено 10 октября, 2020 .
- ^ Гервиг, Г., Веттер, Х. и Шварц, Э.М., Хэсс, Дж. И Крыговски, Калифорния, и Флейшер, Б.М. и Кроенер, М. (май 2004 г.). «Устройство с плавающей запятой IBM eServer z990. IBM J. Res. Dev. 48; стр. 311-322».CS1 maint: несколько имен: список авторов ( ссылка )
- ^ Эрик Шварц (22 июня 2015 г.). «Ускорители IBM z13 SIMD для целых чисел, строк и чисел с плавающей запятой» (PDF) . Проверено 13 июля 2015 года .
- ^ Реализация поддержки форматов двоичного обмена
- ^ Руководство по архитектуре SPARC: версия 8 (архивная копия на web.archive.org) (PDF) . SPARC International, Inc. 1992. Архивировано из оригинального (PDF) 04.02.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 . Sun Microsystems, Inc. 2004 . Проверено 24 сентября 2011 .
Однако есть четыре ситуации, когда оборудование не может успешно выполнить инструкцию с плавающей запятой: ... Инструкция не реализуется на оборудовании (например, ... инструкции с точностью до четырех на любом FPU SPARC).
- ^ Падегс А. (1968). «Структурные аспекты System / 360 Model 85, III: Расширения к архитектуре с плавающей запятой». IBM Systems Journal . 7 : 22–29. DOI : 10.1147 / sj.71.0022 .
- ^ Спецификация RISC-V ISA v. 20191213 , Глава 13, Стандартное расширение «Q» для чисел с плавающей запятой четверной точности, стр. 79.
- ^ [1] Глава 15 (стр. 95).
Внешние ссылки
- Каталог высокоточного программного обеспечения
- QPFloat , бесплатная программная библиотека ( GPL ) для арифметики с четырехкратной точностью
- HPAlib , бесплатная программная библиотека ( LGPL ) для арифметики с четырехкратной точностью
- libquadmath , математическая библиотека GCC с точностью до четвертого.
- Анализ IEEE-754 , интерактивная веб-страница для изучения значений с плавающей запятой Binary32, Binary64 и Binary128