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 −163823,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 0000 16 = 1 (один)
3fff 0000 0000 0000 0000 0000 0000 0001 16 = 1 + 2 −112 ≈ 1.0000000000000000000000000000000001926 (наименьшее число больше единицы)
4000 0000 0000 0000 0000 0000 0000 0000 16 = 2с000 0000 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 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. Диапазон double-double остается по сути тем же самым, что и у формата двойной точности, поскольку показатель степени по-прежнему имеет 11 бит [4] , что значительно меньше 15-битного показателя степени четверной точности IEEE (диапазон 1,8 × 10 308 для double-double против 1,2 × 10 4932 для binary128).

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

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

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

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

Реализации

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

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

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

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

Для языка программирования 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++ Compiler с /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-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, ...), но ни один процессор SPARC не реализует операции четверной точности на аппаратном уровне по состоянию на 2004 год . [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 Floating-point". Он имел один знаковый бит, 15-битную экспоненту и 112 бит дробной части, однако расположение в памяти значительно отличалось от IEEE четверной точности, а смещение экспоненты также отличалось. Только несколько самых ранних процессоров VAX реализовали инструкции H Floating-point на аппаратном уровне, все остальные эмулировали H Floating-point на программном уровне.

Архитектура 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 , такие как потоковые расширения SIMD или AltiVec , которые относятся к 128-битным векторам из четырех 32-битных значений одинарной точности или двух 64-битных значений двойной точности, которые обрабатываются одновременно.

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

Ссылки

  1. ^ Дэвид Х. Бейли; Джонатан М. Борвейн (6 июля 2009 г.). «Высокоточные вычисления и математическая физика» (PDF) .
  2. ^ Хайэм, Николас (2002). «Проектирование стабильных алгоритмов» в Accuracy and Stability of Numerical Algorithms (2-е изд.) . SIAM. стр. 43.
  3. Уильям Кахан (1 октября 1987 г.). «Конспект лекций о состоянии стандарта IEEE 754 для двоичной арифметики с плавающей точкой» (PDF) .
  4. ^ abcd Yozo Hida, X. Li и DH Bailey, Quad-Double Arithmetic: Algorithms, Implementation, and Application, Lawrence Berkeley National Laboratory Technical Report LBNL-46996 (2000). Также Y. Hida и др., Library for double-double and quad-double arithmetic (2007).
  5. ^ abc JR Shewchuk, Адаптивная точность арифметики с плавающей точкой и быстрые надежные геометрические предикаты, Дискретная и вычислительная геометрия 18:305–363, 1997.
  6. ^ Кнут, Д.Э. Искусство программирования (2-е изд.). Глава 4.2.3. Задача 9.
  7. ^ Роберт Мунафо F107 и F161 Высокоточные типы данных с плавающей точкой (2011).
  8. ^ 128-битный тип данных с плавающей точкой двойной точности
  9. ^ sourceware.org Re: Состояние библиотеки glibc
  10. ^ "Intel Fortran Compiler Product Brief (архивная копия на web.archive.org)" (PDF) . Вс. Архивировано из оригинала 25 октября 2008 г. Получено 2010-01-23 .{{cite web}}: CS1 maint: unfit URL (link)
  11. ^ "GCC 4.6 Release Series - Изменения, новые функции и исправления" . Получено 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 Numerics Архивировано 9 октября 2012 г. на Wayback Machine
  19. ^ 128-битные двойные процедуры поддержки для Darwin
  20. ^ Параметры SPARC, использование коллекции компиляторов GNU .
  21. ^ Математические библиотеки, Руководство по численным вычислениям Sun Studio 11 (2005).
  22. ^ Дополнительные типы с плавающей точкой, использующие коллекцию компиляторов GNU
  23. ^ ab "GCC 6 Release Series - Изменения, новые функции и исправления" . Получено 2016-09-13 .
  24. ^ Форумы Intel C++ (2007).
  25. ^ "Floats". ziglang.org . Получено 7 января 2024 г. .
  26. ^ "Основной репозиторий Carbon Language - Дизайн языка". GitHub . 2022-08-09 . Получено 2022-09-22 .
  27. ^ Кросс, Трэвис. "Отслеживание проблемы для типов float f16 и f128". GitHub . Получено 2024-07-05 .
  28. ^ "Boost.Multiprecision - float128" . Получено 2015-06-22 .
  29. ^ Павел Голобородько (2013-01-20). "Быстрые вычисления с четверной точностью в MATLAB" . Получено 2015-06-22 .
  30. ^ "DoubleFloats.jl". GitHub .
  31. ^ "doubledouble.py". GitHub .
  32. ^ Шварц, Э. М.; Крыговски, К. А. (сентябрь 1999 г.). «Блок с плавающей точкой S/390 G5». IBM Journal of Research and Development . 43 (5/6): 707–721. CiteSeerX 10.1.1.117.6711 . doi :10.1147/rd.435.0707. 
  33. ^ Gerwig, G. и Wetter, H. и Schwarz, EM и Haess, J. и Krygowski, CA и Fleischer, BM и Kroener, M. (май 2004 г.). "Блок с плавающей точкой IBM eServer z990. IBM J. Res. Dev. 48; стр. 311-322".{{cite news}}: CS1 maint: multiple names: authors list (link)
  34. ^ Эрик Шварц (22 июня 2015 г.). «Ускорители IBM z13 SIMD для целых чисел, строк и чисел с плавающей точкой» (PDF) . Получено 13 июля 2015 г. .
  35. ^ "Поддержка реализатора для двоичных форматов обмена". IEEE . Архивировано из оригинала 2017-10-27 . Получено 2021-07-15 .
  36. ^ Руководство по архитектуре 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 в качестве основных типов данных.
  37. ^ Дэвид Л. Уивер; Том Джермонд, ред. (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 бит) или их смесь.
  38. ^ "SPARC Behavior and Implementation". Numerical Computation Guide — Sun Studio 10 . Sun Microsystems, Inc. 2004 . Получено 24.09.2011 . Однако существуют четыре ситуации, когда оборудование не может успешно выполнить инструкцию с плавающей точкой: ... Инструкция не реализована оборудованием (например, ... инструкции с четверной точностью на любом SPARC FPU).
  39. ^ Падегс А (1968). «Структурные аспекты System/360 Model 85, III: Расширения для архитектуры с плавающей точкой». IBM Systems Journal . 7 : 22–29. doi :10.1147/sj.71.0022.
  40. ^ Справочное руководство по языку ассемблера Vector Engine, Глава 4 Синтаксис ассемблера, страница 23.
  41. ^ Руководство по архитектуре SX-Aurora TSUBASA, редакция 1.1 (стр. 38, 60).
  42. ^ Спецификация RISC-V ISA v. 20191213, Глава 13, Стандартное расширение «Q» для чисел с плавающей точкой четверной точности, стр. 79.
  43. ^ [1] Глава 15 (стр. 95).

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