Повышенная точность относится к форматам чисел с плавающей запятой, которые обеспечивают более высокая точность, чем в базовых форматах с плавающей запятой. Форматы повышенной точности поддерживают базовый формат за счет минимизации ошибок округления и переполнения в промежуточных значениях выражений в базовом формате. В отличие от расширенной точности, арифметика произвольной точности относится к реализациям гораздо более крупных числовых типов (с объемом памяти, который обычно не является степенью двойки) с использованием специального программного обеспечения (или, реже, оборудования).
Существует долгая история расширенных форматов с плавающей запятой, восходящая почти к середине прошлого века. Различные производители использовали разные форматы для повышения точности для разных станков. Во многих случаях формат расширенной точности не совсем то же самое, что масштабирование обычных форматов с одинарной и двойной точностью, которые он предназначен для расширения. В некоторых случаях реализация была просто программным изменением формата данных с плавающей запятой, но в большинстве случаев повышенная точность была реализована аппаратно, либо встроенным в сам центральный процессор, либо, чаще, встроен в оборудование дополнительного присоединенного процессора, называемого «блок с плавающей запятой » (FPU) или «процессор с плавающей запятой» (FPP ), доступный для CPU как устройство быстрого ввода / вывода.
Модель IBM 1130, продаваемая в 1965 году, предлагала два формата с плавающей запятой: 32-битный формат «стандартной точности» и 40-битный формат. битовый формат «повышенной точности». Формат стандартной точности содержит 24-битное дополнение до двух значащее, в то время как расширенная точность использует 32-битное дополнение до двух значащее. Последний формат полностью использует 32-битные целочисленные операции ЦП. Характеристикой в обоих форматах является 8-битовое поле, содержащее степень двойки со смещением на 128. Арифметические операции с плавающей запятой выполняются программно, а двойная точность вообще не поддерживается. Расширенный формат занимает три 16-битных слова, а дополнительное пространство просто игнорируется.
IBM System / 360 поддерживает 32-битный «короткий» формат с плавающей запятой и 64-битный формат с плавающей запятой. битовый "длинный" формат с плавающей запятой. 360/85 и последующие System / 370 добавляют поддержку 128-битного «расширенного» формата. Эти форматы все еще поддерживаются в текущем проекте, где они теперь называются форматами «шестнадцатеричных чисел с плавающей запятой » (HFP).
Порт Microsoft BASIC для процессора 6502, например, в таких адаптациях, как Commodore BASIC, AppleSoft BASIC или, с 1977 года, поддерживает расширенный 40-битный вариант формата с плавающей запятой Microsoft Binary Format (MBF).
Стандарт IEEE 754 с плавающей запятой рекомендует, чтобы реализации обеспечивали форматы повышенной точности. Стандарт определяет минимальные требования для расширенного формата, но не определяет кодировку. Кодировка выбирается разработчиком.
Процессоры IA32, x86-64 и Itanium поддерживают 80-битное "двойное расширение" формат расширенной точности с 64-битным значением. Intel 8087 math сопроцессор был первым устройством x86, которое аппаратно поддерживало арифметические операции с плавающей запятой. Он был разработан для поддержки 32-битного формата «одинарной точности» и 64-битного формата «двойной точности» для кодирования и перестановки чисел с плавающей запятой. Временный реальный (расширенный) формат был разработан не для хранения данных с более высокой точностью как таковой, а в первую очередь для обеспечения более надежного и точного вычисления двойных результатов за счет минимизации ошибок переполнения и округления в промежуточных вычислениях. Например, многие алгоритмы с плавающей запятой (например, возведение в степень ) страдают от значительной потери точности при вычислении с использованием наиболее прямых реализаций. Чтобы смягчить такие проблемы, внутренние регистры в 8087 были разработаны для хранения промежуточных результатов в 80-битном формате «повышенной точности». 8087 автоматически преобразует числа в этот формат при загрузке регистров с плавающей запятой из памяти, а также преобразует результаты обратно в более традиционные форматы при сохранении регистров обратно в память. Чтобы промежуточные результаты подвыражения сохранялись в временных переменных повышенной точности и продолжались в операторах языка программирования, а также для возобновления прерванных вычислений с того места, где они были прерваны, он предоставляет инструкции , которые передают значения между этими внутренними регистрами и памятью без выполнение любого преобразования, что, таким образом, обеспечивает доступ к расширенному формату для вычислений - также поднимает вопрос о точности функций таких чисел, но с более высокой точностью.
блоки с плавающей запятой (FPU) на всех последующих процессорах x86 поддерживали этот формат. В результате может быть разработано программное обеспечение, которое использует преимущества более высокой точности, обеспечиваемой этим форматом. Уильям Кахан, главный разработчик арифметики x87 и первоначальное предложение по стандарту IEEE 754, отмечает разработку плавающей запятой x87: «Расширенный формат настолько широкий, насколько мы осмеливались (80 бит), был включен для обслуживания ту же вспомогательную роль, что и внутренний 13-десятичный формат, выполняет 10-ти десятичные калькуляторы Hewlett-Packard ». Более того, Кахан отмечает, что 64 бита были самым широким значением, по которому распространение переноса могло быть выполнено без увеличения времени цикла на 8087, и что расширенная точность x87 была разработана для обеспечения более высокой точности в будущих процессорах: «На данный момент 10-байтовый расширенный формат - это приемлемый компромисс между значением сверхточной арифметики и ценой ее реализации для быстрой работы; очень скоро еще два байта точности станут допустимыми, и в конечном итоге 16 байтовый формат.... Такая постепенная эволюция в сторону более широкой точности уже рассматривалась, когда был создан Стандарт IEEE 754 для арифметики с плавающей запятой. "
Математические сопроцессоры Motorola 6888x и процессоры Motorola 68040 и 68060 поддерживают тот же 64-битный тип значимой и расширенной точности (аналогичный формату Intel, но с дополнением до 96-битного формата с 16 неиспользованными битами, вставленными между полями экспоненты и мантиссы). Последующие процессоры Coldfire не поддерживают этот 96-битный формат расширенной точности.
80-битные форматы x87 и Motorola 68881 соответствуют требованиям двойного расширенного формата IEEE 754, так как поддерживает IEEE 754 128-битный формат.
Формат расширенной точности x86 - это 80-битный формат, впервые реализованный в сопроцессоре Intel 8087 math и поддерживаемый всеми процессорами, основанными на архитектуре x86, которые включают модуль с плавающей запятой (FPU). Этот 80-битный формат использует один бит для знака мантиссы, 15 битов для поля экспоненты (то есть тот же диапазон, что и для 128-битного формата IEEE 754 с четырехкратной точностью ) и 64 бита для мантиссы. Поле экспоненты смещено на 16383, что означает, что 16383 должно быть вычтено из значения в поле экспоненты, чтобы вычислить фактическую степень 2. Значение поля экспоненты 32767 (все пятнадцать бит 1 ) зарезервирован для обеспечения возможности представления особых состояний, таких как бесконечность и Not a Number. Если поле экспоненты равно нулю, значением является денормальное число, а показатель степени 2 равен −16382.
В следующей таблице «s» - это значение знакового бита (0 означает положительный, 1 означает отрицательное), «e» - это значение поля экспоненты, интерпретируемое как положительное целое число, а «m» - это значение, интерпретируемое как положительное двоичное число, где двоичная точка находится между битами 63 и 62. «m» Поле "представляет собой комбинацию целой и дробной частей на диаграмме выше.
Показатель | Значимость | Значение | |
---|---|---|---|
Все нули | Бит 63 | Биты 62-0 | |
Ноль | Ноль | Ноль. Знаковый бит дает знак нуля. | |
Ненулевое | Ненормальное. Значение равно (-1) × m× 2 | ||
Один | Anything | Псевдо-денормальное. 80387 и более поздние версии правильно интерпретируют это значение, но не генерируют его. Значение равно (-1) × m× 2 | |
Все единицы | Биты 63,62 | Биты 61-0 | |
00 | Ноль | Псевдо-бесконечность. Знаковый бит дает знак бесконечности. 8087 и 80287 рассматривают это как бесконечность. 80387 и более поздние версии обрабатывают это как недопустимый операнд. | |
Ненулевое | Псевдо-не число. Знаковый бит не имеет смысла. 8087 и 80287 рассматривают это как сигнал, а не число. 80387 и более поздние версии обрабатывают это как недопустимый операнд. | ||
01 | Все, что угодно | Псевдо - не число. Знаковый бит не имеет смысла. 8087 и 80287 рассматривают это как сигнал, а не число. 80387 и более поздние версии обрабатывают это как недопустимый операнд. | |
10 | Ноль | Бесконечность. Знаковый бит дает знак бесконечности. 8087 и 80287 рассматривают это как сигнал, а не число. Сопроцессоры 8087 и 80287 использовали представление псевдобесконечности для бесконечностей. | |
Ненулевое значение | Сигнализация Не число, бит знака не имеет смысла. | ||
11 | Ноль | Неопределенный с плавающей запятой, результат неверных вычислений, таких как квадратный корень из отрицательного числа, логарифм отрицательного числа, 0/0, бесконечность / бесконечность, бесконечность, умноженная на 0, и другие, когда процессор был настроен так, чтобы не генерировать исключения для недопустимых операндов. Знаковый бит не имеет смысла. Это особый случай Тихого, а не числа. | |
Ненулевое значение | Тихо Не число, бит знака не имеет смысла. 8087 и 80287 рассматривают это как сигнал, а не число. | ||
Все остальные значения | Бит 63 | Биты 62-0 | |
Ноль | Любое | Ненормальное. Генерируется только на 8087 и 80287. 80387 и более поздние версии обрабатывают это как недопустимый операнд. Значение равно (-1) × м× 2 | |
Один | Что угодно | Нормализованное значение. Значение равно (-1) × m× 2 |
В отличие от форматов single и двойной точности, этот формат не использует неявный / скрытый бит. Напротив, бит 63 содержит целую часть мантиссы, а биты 62-0 содержат дробную часть. Бит 63 будет равен 1 для всех нормализованных чисел. При разработке 8087 у этой конструкции было несколько преимуществ:
80-битный формат с плавающей запятой был широко доступен к 1984 году, после разработки C, Fortran и подобных компьютерных языков, которые изначально предлагали только общие 32- и 64-битные размеры с плавающей запятой. В архитектуре x86 большинство компиляторов C теперь поддерживают 80-битную расширенную точность с помощью типа long double, и это было указано в C99 / C11 стандарты (арифметика с плавающей запятой IEC 60559 (приложение F)). Компиляторы на x86 для других языков часто также поддерживают повышенную точность, иногда с помощью нестандартных расширений: например, Turbo Pascal предлагает расширенный тип
и несколько компиляторов Fortran иметь тип REAL * 10
(аналогично REAL * 4
и REAL * 8
). Такие компиляторы также обычно включают математические подпрограммы повышенной точности, такие как квадратный корень и тригонометрические функции, в свои стандартные библиотеки.
80-битный формат с плавающей запятой имеет диапазон (включая субнормальные ) от приблизительно 3,65 × 10 до 1,18 × 10. Хотя log 10 (2) ≅ 19,266, этот формат обычно описывается как дающий приблизительно восемнадцать значащих цифр точности. Использование десятичного числа при разговоре о двоичном формате неудачно, потому что большинство десятичных дробей являются повторяющимися последовательностями в двоичном формате, так же как 2/3 - в десятичном. Таким образом, такое значение, как 10,15, представлено в двоичном виде как эквивалент 10,1499996185 и т. Д. В десятичном виде для REAL * 4, но 10,15000000000000035527 и т. Д. в REAL * 8: взаимное преобразование будет включать приближение, за исключением тех немногих десятичных дробей, которые представляют точное двоичное значение, например 0,625. Для REAL * 10 десятичная строка - 10,1499999999999999996530553 и т. Д. Последние 9 цифр - это восемнадцатая цифра дробной части и, следовательно, двадцатая значащая цифра строки. Границы преобразования между десятичным и двоичным форматом для 80-битного формата могут быть заданы следующим образом: если десятичная строка с не более чем 18 значащими цифрами правильно округлена до 80-битного двоичного значения с плавающей запятой IEEE 754 (как на входе), тогда преобразован обратно в то же количество значащих десятичных цифр (как для вывода), тогда конечная строка будет точно соответствовать исходной; в то время как, наоборот, если 80-битное двоичное значение с плавающей запятой IEEE 754 правильно преобразовано и (ближайшее) округлено до десятичной строки с как минимум 21 значащей десятичной цифрой, а затем преобразовано обратно в двоичный формат, оно будет точно соответствовать оригиналу. Эти аппроксимации особенно затруднительны при указании наилучшего значения для констант в формулах с высокой точностью, которые могут быть вычислены с помощью арифметики произвольной точности.
Яркий пример необходимость иметь как минимум 64 бита точности в значении формата расширенной точности - это необходимость избежать потери точности при выполнении возведения в степень для значений двойной точности. Модули с плавающей запятой x86 не предоставляют инструкции, которые напрямую выполняют возведение в степень. Вместо этого они предоставляют набор инструкций, которые программа может последовательно использовать для выполнения возведения в степень с помощью уравнения:
Во избежание потери точности промежуточные результаты «log 2 (x)» и «y · log 2 (x) "должны быть вычислены с гораздо более высокой точностью, потому что фактически и экспонента, и поле значимости x должны соответствовать значению поля промежуточного результата. Впоследствии поле значимости промежуточного результата разделяется между полями показателя степени и значимости конечного результата при вычислении 2. Следующее обсуждение описывает это требование более подробно.
Немного распаковав, значение IEEE 754 двойной точности можно представить как:
где s - знак экспоненты (0 или 1), E - несмещенная экспонента, которая представляет собой целое число в диапазоне от 0 до 1023, а M - мантисса, которая представляет собой 53-битное значение, которое попадает в диапазон 1 ≤ M < 2. Negative numbers and zero can be ignored because the logarithm of these values is undefined. For purposes of this discussion M does not have 53 bits of precision because it is constrained to be greater than or equal to one i.e. the hidden bit does not count towards the precision (Note that in situations where M is less than 1, the value is actually a de-normal and therefore may have already suffered precision loss. This situation is beyond the scope of this article).
Взятие журнала этого представления двойного- точность число и упрощение приводит к следующему:
Этот результат демонстрирует, что при взятии логарифма числа по основанию 2 знак экспоненты исходного значения становится знаком логарифма, показателем степени исходное значение становится целой частью знака ificand логарифма, а значение исходного значения преобразуется в дробную часть значения логарифма.
Поскольку E является целым числом в диапазоне от 0 до 1023, для представления целой части логарифма требуется до 10 битов слева от точки счисления. Поскольку M находится в диапазоне 1 ≤ M < 2, the value of log2, M попадет в диапазон 0 ≤ log 2M < 1 so at least 52 bits are needed to the right of the radix point to represent the fractional part of the logarithm. Combining 10 bits to the left of the radix point with 52 bits to the right of the radix point means that the significand part of the logarithm must be computed to at least 62 bits of precision. In practice values of M less than потребуют 53 бита справа от точка счисления и значения M меньше требуют 54 бита справа от точки счисления, чтобы избежать потери точности. Уравновешивая это требование для дополнительной точности справа от точки счисления, для экспонентов меньше 512 требуется только 9 бит слева от точки счисления, а для показателей меньше 256 требуется только 8 бит слева от точки счисления.
Заключительной частью вычисления возведения в степень является вычисление 2. «Промежуточный результат» состоит из целой части «I», добавленной к дробной части «F». Если промежуточный результат отрицательный, то требуется небольшая корректировка, чтобы получить положительную дробную часть, поскольку «I» и «F» являются отрицательными числами.
Для положительных промежуточных результатов:
Для отрицательных промежуточных результатов:
Таким образом, целая часть промежуточного результата («I» или «I − 1») плюс смещение становится показателем конечного результата, а преобразованная положительная дробная часть промежуточного результата: 2 или 2 становится мантиссой конечного результата. Чтобы обеспечить точность конечного результата в 52 бита, положительная дробная часть должна быть не менее 52 бита.
В заключение, точное количество битов точности, необходимое в значении промежуточного результата, в некоторой степени зависит от данных, но 64 бита достаточно, чтобы избежать потери точности в подавляющем большинстве вычислений возведения в степень с числами двойной точности.
Количество битов, необходимых для экспоненты формата расширенной точности, следует из требования, чтобы произведение двух чисел двойной точности не переполнялось при вычислении с использованием расширенного формата. Наибольший возможный показатель степени значения двойной точности равен 1023, поэтому показатель степени наибольшего возможного произведения двух чисел двойной точности равен 2047 (11-битное значение). Добавление смещения для учета отрицательных показателей степени означает, что поле экспоненты должно иметь ширину не менее 12 бит.
Сочетание этих требований: 1 бит для знака, 12 бит для смещенной экспоненты и 64 бита для мантиссы означает, что для формата с расширенной точностью потребуется не менее 77 бит. Технические соображения привели к окончательному определению 80-битного формата (в частности, стандарт IEEE 754 требует, чтобы диапазон экспоненты формата расширенной точности соответствовал следующему по величине, quad, формату точности, равному 15 бит).
Другим примером вычислений, которые выигрывают от арифметики повышенной точности, являются схемы итеративного уточнения, используемые для косвенного устранения ошибок, накопленных в прямом решении во время обычно очень большого количества выполняемых вычислений для числовой линейной алгебры.
long double
с использованием 80-битных чисел с плавающей запятой в системах x86. Однако это поведение определяется реализацией и не требуется, но разрешено стандартом, как указано для оборудования IEEE 754 в стандарте C99 «Приложение F IEC 60559 арифметика с плавающей запятой». GCC также предоставляет типы __float80
и __float128
.real
с использованием самого большого размера с плавающей запятой, реализованного на оборудовании, 80 бит для x86 ЦП или двойная точность, в зависимости от того, что больше.Float80
.EXT
или EXTENDED
10-байтовый тип данных с плавающей запятой повышенной точности.