Вопрос

Какова фактическая точность длинного двойного на Intel 64-битных платформы? Это 80 битов дополнены до 128 или фактических 128 бит?

Если бы бывшая, кроме того, что GMP, есть ли другой вариант для достижения True 128 точности?

Это было полезно?

Решение

Точность X86-64 такой же, как обычный X86. Расширенные двойные - 80 бит, используя ISA X87, с добавленной 6 байтами прокладки. Там нет 128-битного оборудования FP.

Реализация программного обеспечения Quad или Extended Quad Precision может извлечь выгоду из X86-64 64X64 => 128 Integer Multi размножаемой инструкции, хотя.

Другие советы

Я бы порекомендовал использовать MPFR.. Отказ Это более сложная библиотека с плавающей точкой с несколькими точками, которая построена сверху GMP.

Существует очень вероятность того, что это 64 бита для обоих (в зависимости от компилятора и ОС), поскольку компилятор испускает SCALAR SSE2 вместо инструкции X87.

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

Есть несколько вариантов.

  1. Используйте двойной двойной, чтобы представлять Quad. Например, см. http://www.codeproject.com/articles/884606/the-double-double-type.. Отказ Однако тип не подтверждает стандарт IEEE. Вы можете сказать, осматривая его значение EPSILON, являющееся менее точным, чем стандартный 128-битный поплавок IEEE, который составляет 1,926E-34.
  2. Используйте True Ieee Standard 128-битные поплавки. Компилятор Microsoft VC ++ не предоставляет такого типа. Компилятор Intel C ++ обеспечивает тип _quad, хотя его реализация не завершена (нет операций ввода / вывода) в это время.
  3. Используйте стороннюю библиотеку. Я недавно создал библиотеку под названием Double128, которая основана на Intel C ++ _Quad, но добавляет операции ввода / вывода. Работает с Microsoft VC ++. Вы можете посетить http://www.cg-inc.com/product/double128. Чтобы получить больше информации.

Я рекомендую Boost обертки через MPFR или GMP:

Boost 1.70: CPP_BIN_FLOAT..

А также произвольные типы к любой желаемой точности, приведены следующие типы:

cpp_bin_float_single           (24 bits + mantissa = 32 bits)
cpp_bin_float_double           (53 bits + mantissa = 64 bits)
cpp_bin_float_double_extended  (64 bits + mantissa)
cpp_bin_float_quad             (113 bits + mantissa = 128 bits)
cpp_bin_float_oct              (237 bits) + mantissa = 256 bits)

Boost предлагает практически без коробки. После компиляции все нужно сделать, это добавить указатель в проекте Visual Studio к каталогам включения и библиотеки.

Испытано с Visual Studio 2017 + Boost V1.70.

Видеть Инструкции для компиляции повышения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top