В вычислениях четырехкратная точность (или четырехкратная точность ) — это двоичный компьютерный формат чисел с плавающей запятой , который занимает 16 байт (128 бит) с точностью, по крайней мере, вдвое превышающей 53-битную двойную точность .
Эта 128-битная учетверенная точность предназначена не только для приложений, требующих результатов с точностью выше двойной точности [1] , но также, в качестве основной функции, позволяет более надежно и точно вычислить результаты двойной точности за счет минимизации переполнения и округления. ошибки в промежуточных вычислениях и скретч-переменные. Уильям Кахан , главный архитектор первоначального стандарта чисел с плавающей запятой IEEE 754, отметил: «На данный момент 10-байтовый расширенный формат является приемлемым компромиссом между ценностью сверхточной арифметики и ценой ее реализации для обеспечения быстрой работы; очень скоро два больше байтов точности станет терпимым, и, в конечном итоге, 16-байтовый формат... Подобная постепенная эволюция в сторону большей точности уже рассматривалась, когда был сформулирован стандарт IEEE 754 для арифметики с плавающей запятой ». [2]
В IEEE 754-2008 128- битный формат по основанию 2 официально называетсяbinary128 .
Стандарт IEEE 754 определяет двоичный файл 128 как имеющий:
Это дает точность от 33 до 36 значащих десятичных цифр. Если десятичная строка, содержащая не более 33 значащих цифр, преобразуется в формат четырехкратной точности IEEE 754, давая нормальное число, а затем преобразуется обратно в десятичную строку с тем же количеством цифр, конечный результат должен соответствовать исходной строке. Если число IEEE 754 с четырехкратной точностью преобразуется в десятичную строку, содержащую не менее 36 значащих цифр, а затем преобразуется обратно в представление с четырехкратной точностью, конечный результат должен соответствовать исходному числу. [3]
Формат записывается с неявным ведущим битом со значением 1, если экспонента не хранится со всеми нулями. Таким образом, в формате памяти появляется только 112 бит мантиссы , но общая точность составляет 113 бит (приблизительно 34 десятичных цифры: log 10 (2 113 ) ≈ 34,016 ). Биты располагаются следующим образом:
Двоичная экспонента с плавающей запятой четырехкратной точности кодируется с использованием двоичного представления смещения, при этом нулевое смещение равно 16383; это также известно как смещение показателя в стандарте IEEE 754.
Таким образом, как определено двоичным представлением смещения, чтобы получить истинный показатель степени, смещение 16383 необходимо вычесть из сохраненного показателя степени.
Сохраненные показатели степени 0000 16 и 7FFF 16 интерпретируются особым образом.
Минимальное строго положительное (субнормальное) значение составляет 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,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 год прямая аппаратная поддержка четверной точности встречается [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 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 предоставляет тип четырехкратной точности, называемый для процессоров __float128
x86, 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]
__float128
выполняет __complex128
операции.__float128
типов _Quad
и включает пользовательскую реализацию стандартной математической библиотеки. [28]Четверная точность 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 не реализует аппаратные операции четырехточности [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-битных значения двойной точности, которые обрабатываются одновременно.
{{cite web}}
: CS1 maint: unfit URL (link){{cite news}}
: CS1 maint: multiple names: authors list (link)SPARC — это архитектура набора команд (ISA) с 32-битным целым числом и 32-, 64- и 128-битным числом с плавающей запятой стандарта IEEE 754 в качестве основных типов данных.
С плавающей запятой: архитектура предоставляет набор команд с плавающей запятой, совместимый со стандартом IEEE 754, работающий с отдельным файлом регистров, который обеспечивает 32 команды одинарной точности (32 бита), 32 команды двойной точности (64 бита), 16 команд четырехкратной точности. (128-битные) регистры или их смесь.
Однако есть четыре ситуации, когда аппаратное обеспечение не сможет успешно выполнить инструкцию с плавающей запятой: ... Инструкция не реализуется аппаратным обеспечением (например, ... инструкции четырехкратной точности на любом SPARC FPU).