Повышенная точность

редактировать
Форматы чисел с плавающей запятой

Повышенная точность относится к форматам чисел с плавающей запятой, которые обеспечивают более высокая точность, чем в базовых форматах с плавающей запятой. Форматы повышенной точности поддерживают базовый формат за счет минимизации ошибок округления и переполнения в промежуточных значениях выражений в базовом формате. В отличие от расширенной точности, арифметика произвольной точности относится к реализациям гораздо более крупных числовых типов (с объемом памяти, который обычно не является степенью двойки) с использованием специального программного обеспечения (или, реже, оборудования).

Содержание

  • 1 Реализации с расширенной точностью
    • 1.1 Форматы расширенной точности IBM
    • 1.2 Формат расширенной точности Microsoft MBF
    • 1.3 Форматы расширенной точности IEEE 754
  • 2 Формат расширенной точности x86
    • 2.1 Введение использовать
    • 2.2 Рабочий диапазон
    • 2.3 Необходимость в 80-битном формате
    • 2.4 Языковая поддержка
  • 3 См. также
  • 4 Сноски
  • 5 Ссылки

Реализации с повышенной точностью

Существует долгая история расширенных форматов с плавающей запятой, восходящая почти к середине прошлого века. Различные производители использовали разные форматы для повышения точности для разных станков. Во многих случаях формат расширенной точности не совсем то же самое, что масштабирование обычных форматов с одинарной и двойной точностью, которые он предназначен для расширения. В некоторых случаях реализация была просто программным изменением формата данных с плавающей запятой, но в большинстве случаев повышенная точность была реализована аппаратно, либо встроенным в сам центральный процессор, либо, чаще, встроен в оборудование дополнительного присоединенного процессора, называемого «блок с плавающей запятой » (FPU) или «процессор с плавающей запятой» (FPP ), доступный для CPU как устройство быстрого ввода / вывода.

Форматы расширенной точности IBM

Модель IBM 1130, продаваемая в 1965 году, предлагала два формата с плавающей запятой: 32-битный формат «стандартной точности» и 40-битный формат. битовый формат «повышенной точности». Формат стандартной точности содержит 24-битное дополнение до двух значащее, в то время как расширенная точность использует 32-битное дополнение до двух значащее. Последний формат полностью использует 32-битные целочисленные операции ЦП. Характеристикой в ​​обоих форматах является 8-битовое поле, содержащее степень двойки со смещением на 128. Арифметические операции с плавающей запятой выполняются программно, а двойная точность вообще не поддерживается. Расширенный формат занимает три 16-битных слова, а дополнительное пространство просто игнорируется.

IBM System / 360 поддерживает 32-битный «короткий» формат с плавающей запятой и 64-битный формат с плавающей запятой. битовый "длинный" формат с плавающей запятой. 360/85 и последующие System / 370 добавляют поддержку 128-битного «расширенного» формата. Эти форматы все еще поддерживаются в текущем проекте, где они теперь называются форматами «шестнадцатеричных чисел с плавающей запятой » (HFP).

Формат расширенной точности Microsoft MBF

Порт Microsoft BASIC для процессора 6502, например, в таких адаптациях, как Commodore BASIC, AppleSoft BASIC или, с 1977 года, поддерживает расширенный 40-битный вариант формата с плавающей запятой Microsoft Binary Format (MBF).

Форматы расширенной точности IEEE 754

Стандарт 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

Формат расширенной точности x86 - это 80-битный формат, впервые реализованный в сопроцессоре Intel 8087 math и поддерживаемый всеми процессорами, основанными на архитектуре x86, которые включают модуль с плавающей запятой (FPU). Этот 80-битный формат использует один бит для знака мантиссы, 15 битов для поля экспоненты (то есть тот же диапазон, что и для 128-битного формата IEEE 754 с четырехкратной точностью ) и 64 бита для мантиссы. Поле экспоненты смещено на 16383, что означает, что 16383 должно быть вычтено из значения в поле экспоненты, чтобы вычислить фактическую степень 2. Значение поля экспоненты 32767 (все пятнадцать бит 1 ) зарезервирован для обеспечения возможности представления особых состояний, таких как бесконечность и Not a Number. Если поле экспоненты равно нулю, значением является денормальное число, а показатель степени 2 равен −16382.

X86 Extended Floating Point Format.svg

В следующей таблице «s» - это значение знакового бита (0 означает положительный, 1 означает отрицательное), «e» - это значение поля экспоненты, интерпретируемое как положительное целое число, а «m» - это значение, интерпретируемое как положительное двоичное число, где двоичная точка находится между битами 63 и 62. «m» Поле "представляет собой комбинацию целой и дробной частей на диаграмме выше.

Интерпретация полей значения расширенной точности x86
ПоказательЗначимостьЗначение
Все нулиБит 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 у этой конструкции было несколько преимуществ:

  • Вычисления могут быть выполнены немного быстрее, если все биты мантиссы присутствуют в регистре.
  • A 64 -битовая величина обеспечивает достаточную точность, чтобы избежать потери точности при преобразовании результатов обратно в формат двойной точности в большом количестве случаев.
  • Этот формат предоставляет механизм для индикации потери точности из-за потери значимости, которая может быть осуществляется дальнейшие операции. Например, вычисление 2 × 10 × 3 × 10 × 4 × 10 генерирует промежуточный результат 6 × 10, который является денормальным и также включает потерю точности. Произведение всех членов составляет 24 × 10, что может быть представлено как нормализованное число. 80287 может завершить это вычисление и указать потерю точности, вернув «ненормальный» результат (показатель степени не равен 0, бит 63 = 0). Процессоры, начиная с 80387, больше не генерируют ненормальные сигналы и не поддерживают нестандартные входные данные для операций. Они будут генерировать денормализацию, если происходит потеря значимости, но будут генерировать нормализованный результат, если последующие операции над денормализацией могут быть нормализованы.

Введение в использование

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 значащей десятичной цифрой, а затем преобразовано обратно в двоичный формат, оно будет точно соответствовать оригиналу. Эти аппроксимации особенно затруднительны при указании наилучшего значения для констант в формулах с высокой точностью, которые могут быть вычислены с помощью арифметики произвольной точности.

Необходимость в 80-битном формате

Яркий пример необходимость иметь как минимум 64 бита точности в значении формата расширенной точности - это необходимость избежать потери точности при выполнении возведения в степень для значений двойной точности. Модули с плавающей запятой x86 не предоставляют инструкции, которые напрямую выполняют возведение в степень. Вместо этого они предоставляют набор инструкций, которые программа может последовательно использовать для выполнения возведения в степень с помощью уравнения:

xy = 2 y ⋅ log 2 ⁡ (x) {\ displaystyle x ^ {y} = 2 ^ {\, y \, \ cdot \, \ log _ {2} (x)}}{\ displaystyle x ^ {y} = 2 ^ {\, y \, \ cdot \, \ log _ {2} (x)}}

Во избежание потери точности промежуточные результаты «log 2 (x)» и «y · log 2 (x) "должны быть вычислены с гораздо более высокой точностью, потому что фактически и экспонента, и поле значимости x должны соответствовать значению поля промежуточного результата. Впоследствии поле значимости промежуточного результата разделяется между полями показателя степени и значимости конечного результата при вычислении 2. Следующее обсуждение описывает это требование более подробно.

Немного распаковав, значение IEEE 754 двойной точности можно представить как:

2 (- 1) s ⋅ E ⋅ M {\ displaystyle 2 ^ {(- 1) ^ {s} \, \ cdot \, E} \, \ cdot \, M \}{\ displaystyle 2 ^ {(- 1) ^ {s} \, \ cdot \, E} \, \ cdot \, M \}

где 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).

Взятие журнала этого представления двойного- точность число и упрощение приводит к следующему:

log 2 ⁡ (2 (- 1) s ⋅ E ⋅ M) = (- 1) s ⋅ E ⋅ log 2 ⁡ (2) + log 2 ⁡ ( M) знак равно ± E + журнал 2 ⁡ (M) {\ Displaystyle \ log _ {2} (2 ^ {(- 1) ^ {s} \, \ cdot \, E} \, \ cdot \, M) = (-1) ^ {s} \, \ cdot \, E \, \ cdot \, \ log _ {2} (2) \, + \, \ log _ {2} (M) = \ pm \, E \, + \, \ log _ {2} (M)}{\ displaystyle \ log _ {2} (2 ^ {(- 1) ^ {s} \, \ cdot \, E} \, \ cdot \, M) = (- 1) ^ {s} \, \ cdot \, E \, \ cdot \, \ log _ {2} (2) \, + \, \ log _ {2} (M) = \ pm \, E \, + \, \ log _ {2} (M)}

Этот результат демонстрирует, что при взятии логарифма числа по основанию 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 2 {\ displaystyle {\ sqrt {2}}}{\ sqrt {2}} потребуют 53 бита справа от точка счисления и значения M меньше 2 4 {\ displaystyle {\ sqrt [{4}] {2}}}{\ sqrt [{4}] {2}} требуют 54 бита справа от точки счисления, чтобы избежать потери точности. Уравновешивая это требование для дополнительной точности справа от точки счисления, для экспонентов меньше 512 требуется только 9 бит слева от точки счисления, а для показателей меньше 256 требуется только 8 бит слева от точки счисления.

Заключительной частью вычисления возведения в степень является вычисление 2. «Промежуточный результат» состоит из целой части «I», добавленной к дробной части «F». Если промежуточный результат отрицательный, то требуется небольшая корректировка, чтобы получить положительную дробную часть, поскольку «I» и «F» являются отрицательными числами.

Для положительных промежуточных результатов:

2 intermediateresult = 2 I + F = 2 I 2 F {\ displaystyle 2 ^ {\ mathrm {intermediate \ result}} = 2 ^ {I + F} = 2 ^ {I} \, 2 ^ {F}}2 ^ {{{\ mathrm {intermediate \ result}}}} = 2 ^ {{I + F}} = 2 ^ {I} \, 2 ^ {F}

Для отрицательных промежуточных результатов:

2 промежуточный результат = 2 I + F = 2 I + (1 - 1) + F = 2 (I - 1) + ( 1 + F) = 2 I - 1 2 1 + F {\ displaystyle 2 ^ {\ mathrm {intermediate \ result}} = 2 ^ {I + F} = 2 ^ {I \, + \, (1-1) \, + \, F} = 2 ^ {(I-1) \, + \, (1 + F)} = 2 ^ {I-1} \, 2 ^ {1 + F}}2 ^ {{{\ mathrm {intermediate \ result}}}} = 2 ^ {{I + F}} = 2 ^ {{I \, + \, (1-1) \, + \, F}} = 2 ^ {{(I-1) \, + \, (1 + F)}} = 2 ^ {{I-1}} \, 2 ^ {{1 + F}}

Таким образом, целая часть промежуточного результата («I» или «I − 1») плюс смещение становится показателем конечного результата, а преобразованная положительная дробная часть промежуточного результата: 2 или 2 становится мантиссой конечного результата. Чтобы обеспечить точность конечного результата в 52 бита, положительная дробная часть должна быть не менее 52 бита.

В заключение, точное количество битов точности, необходимое в значении промежуточного результата, в некоторой степени зависит от данных, но 64 бита достаточно, чтобы избежать потери точности в подавляющем большинстве вычислений возведения в степень с числами двойной точности.

Количество битов, необходимых для экспоненты формата расширенной точности, следует из требования, чтобы произведение двух чисел двойной точности не переполнялось при вычислении с использованием расширенного формата. Наибольший возможный показатель степени значения двойной точности равен 1023, поэтому показатель степени наибольшего возможного произведения двух чисел двойной точности равен 2047 (11-битное значение). Добавление смещения для учета отрицательных показателей степени означает, что поле экспоненты должно иметь ширину не менее 12 бит.

Сочетание этих требований: 1 бит для знака, 12 бит для смещенной экспоненты и 64 бита для мантиссы означает, что для формата с расширенной точностью потребуется не менее 77 бит. Технические соображения привели к окончательному определению 80-битного формата (в частности, стандарт IEEE 754 требует, чтобы диапазон экспоненты формата расширенной точности соответствовал следующему по величине, quad, формату точности, равному 15 бит).

Другим примером вычислений, которые выигрывают от арифметики повышенной точности, являются схемы итеративного уточнения, используемые для косвенного устранения ошибок, накопленных в прямом решении во время обычно очень большого количества выполняемых вычислений для числовой линейной алгебры.

Поддержка языка

  • Некоторые реализации C /C ++ (например, GNU Compiler Collection (GCC), Clang, Intel C ++ ) реализовать long double с использованием 80-битных чисел с плавающей запятой в системах x86. Однако это поведение определяется реализацией и не требуется, но разрешено стандартом, как указано для оборудования IEEE 754 в стандарте C99 «Приложение F IEC 60559 арифметика с плавающей запятой». GCC также предоставляет типы __float80и __float128.
  • D язык программирования реализует realс использованием самого большого размера с плавающей запятой, реализованного на оборудовании, 80 бит для x86 ЦП или двойная точность, в зависимости от того, что больше.
  • Object Pascal (Delphi ) имеет в дополнение к SINGLE и DOUBLE тип EXTENDED.
  • Система времени выполнения Racket предоставляет 80-битный тип данных extflonum в системах x86.
  • Стандартная библиотека Swift предоставляет тип данных Float80.
  • Компилятор BASIC предоставляет EXTили EXTENDED10-байтовый тип данных с плавающей запятой повышенной точности.

См. Также

Сноски

Ссылки

Последняя правка сделана 2021-05-19 10:10:32
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте