Каковы применения / преимущества 80-битного типа данных повышенной точности? - PullRequest
15 голосов
/ 05 марта 2009

Да, я хотел сказать 80-бит . Это не опечатка ...

Мой опыт работы с переменными с плавающей запятой всегда включал 4-байтовые множители, такие как синглы (32 бита), двойные (64 бита) и длинные двойные (которые я видел как 96-битные или 128-битные). ). Вот почему я был немного озадачен, когда наткнулся на 80-битный тип данных с расширенной точностью , когда работал над кодом для чтения и записи в AIFF (Audio Interchange File Format) файлы : переменная расширенной точности была выбрана для хранения частоты дискретизации звуковой дорожки.

Когда я пролистал Википедию, я нашел ссылку выше вместе с кратким упоминанием о 80-битных форматах в сводке IEEE 754-1985 стандарта (но не в IEEE 754-2008 стандарт резюме). Похоже, что в некоторых архитектурах «extended» и «long double» являются синонимами.

Одна вещь, с которой я не сталкивался, это конкретные приложения, использующие типы данных с повышенной точностью (за исключением, конечно, частоты дискретизации файлов AIFF). Это заставило меня задуматься:

  • Кто-нибудь сталкивался с ситуацией, когда для какой-то прикладной программы было необходимо / полезно расширенная точность?
  • Каковы преимущества 80-битного числа с плавающей запятой, кроме очевидного «это немного больше точности, чем удвоение, но меньше байтов, чем в большинстве реализаций long double»?
  • Его применимость уменьшается?

Ответы [ 6 ]

24 голосов
/ 05 марта 2009

В FPU Intel используется 80-битный формат для большей точности промежуточных результатов.

То есть, у вас могут быть 32-битные или 64-битные переменные, но когда они загружаются в регистры FPU, они конвертируются в 80-битные; тогда FPU (по умолчанию) выполняет все вычисления за 80, но; после вычисления результат сохраняется в 32-битной или 64-битной переменной.

Кстати: несколько неприятное последствие этого заключается в том, что сборки отладки и выпуска могут давать немного разные результаты: в сборке выпуска оптимизатор может хранить промежуточную переменную в 80-битном регистре FPU, а в сборке отладки - будет храниться в 64-битной переменной, что приведет к потере точности. Вы можете избежать этого, используя 80-битные переменные, или использовать переключатель FPU (или опцию компилятора) для выполнения всех вычислений в 64-битном формате.

9 голосов
/ 30 марта 2012

Для меня использование 80 бит важно. Таким образом, я получаю собственные значения высшего порядка (30 000) и собственные векторы симметричных матриц с еще четырьмя фигурами при использовании библиотеки GOTO для векторных внутренних произведений, а именно 13 вместо 9 значащих цифр для вида матриц, которые я использую в релятивистских атомных матрицах. расчеты, которые необходимы, чтобы избежать попадания в море состояний с отрицательной энергией. Другой вариант - использование арифметики с четверной точностью, которая увеличивает процессорное время в 60-70 раз, а также увеличивает требования к оперативной памяти. Любой расчет, основанный на внутренних произведениях больших векторов, принесет пользу. Конечно, чтобы сохранить частичные результаты внутреннего продукта в регистрах, необходимо использовать язык ассемблера, как в библиотеках GOTO. Вот так я полюбил свои старые процессоры Opteron 850, которые буду использовать до тех пор, пока они будут работать в той части моих расчетов.

Причина, по которой 80 битов быстры, а большая точность гораздо медленнее, состоит в том, что стандартное аппаратное обеспечение ЦП имеет 80-битные регистры. Поэтому, если вам нужны дополнительные 16 битов (11 дополнительных битов мантиссы, четыре дополнительных бита экспоненты и один дополнительный бит, фактически неиспользуемый), то расширение на самом деле не стоит больших затрат с 64 до 80 бит - тогда как расширение за 80 бит чрезвычайно дорого с точки зрения времени выполнения. Таким образом, вы можете также использовать 80-битную точность, если хотите. Это не бесплатно, но довольно дешево.

5 голосов
/ 05 марта 2009

Википедия объясняет , что 80-битный формат может представлять все 64-битное целое число без потери информации. Таким образом, модуль с плавающей запятой CPU может использоваться для реализации умножения и деления на целые числа.

2 голосов
/ 17 февраля 2015

Другое преимущество, еще не упомянутое для 80-битных типов, заключается в том, что на 16-битных или 32-битных процессорах, которые не имеют блоков с плавающей запятой, но есть команда «умножения», которая дает результат вдвое дольше, чем операнды (16x16-> 32 или 32x32-> 64), арифметика на 64-битной мантиссе, разделенная на четыре или два 16-битных или 32-битных регистра, будет быстрее, чем арифметика на 53-битной мантиссе, которая охватывает то же число регистры, но должны совместно использовать 12 битов регистра со знаком и показателем степени. Для приложений, которым не требуется ничего более точного, чем float, вычисления для 48-разрядного типа «расширенного числа с плавающей запятой» также могут быть быстрее, чем вычисления для 32-разрядного float.

В то время как некоторые люди могут оплакивать поведение двойного округления типов с расширенной точностью, это реально является проблемой только в специализированных приложениях, требующих полной точной бит-кроссплатформенной воспроизводимости. С точки зрения точность разница между ошибкой округления 64/128 против 65/128 или 1024 / 2048ulp против 1025/2048 не является проблемой; в языках с типами переменных расширенной точности и согласованной семантикой расширенной точности использование расширенных типов на многих платформах без аппаратного обеспечения с плавающей запятой (например, встроенных систем) будет предлагать как более высокую точность, так и лучшая скорость, чем у типов с плавающей точкой одинарной или двойной точности.

1 голос
/ 18 января 2010

Я использовал 80-бит для математического исследования. Я должен был суммировать термины в бесконечной серии, которая стала довольно большой, вне диапазона двойных чисел. Конвергенция и точность не были проблемой, только способность обращаться с большими показателями как 1E1000. Возможно, какая-то умная алгебра могла бы упростить вещи, но было проще и проще просто написать алгоритм с повышенной точностью, чем тратить время на размышления об этом.

0 голосов
/ 05 марта 2009

У меня есть друг, который работает в этом. Он работает над библиотекой для обработки чисел с плавающей запятой размером в гигабайты. Конечно, это что-то связанное с научными вычислениями (вычисления с плазмой), и, вероятно, только такие вычисления работают с такими большими числами ...

...