Длинная двойная точность x86-64
Какова реальная точность long double на 64-битных платформах Intel? 80 бит дополняется до 128 или 128 бит?
если прежний, кроме перехода в gmp, есть ли другой вариант для достижения истинной точности 128?
4 ответа
Точность x86-64 такая же, как и у обычного x86. Расширенный double равен 80 битам, с использованием ISA x87, с добавлением 6 байтов заполнения. Там нет 128-битного оборудования FP.
Однако программная реализация с четырьмя или с расширенной четверной точностью может выиграть от x86-64 64x64 => 128 целочисленного умножения.
Я бы порекомендовал использовать MPFR. Это более сложная библиотека с плавающей запятой с множественной точностью, построенная на основе GMP.
Существует большая вероятность, что она будет 64-битной для обоих (в зависимости от компилятора и ОС), потому что компилятор выдает скалярный SSE2 вместо инструкций x87.
x86 не поддерживает более высокую точность, чем 80 бит, но если вам действительно нужно более 64 бит для алгоритма FP, скорее всего, вам следует проверить свои цифры вместо решения проблемы с помощью грубой силы.
Я рекомендую обертки Boost поверх MPFR или GMP:
Повышение 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 на каталоги include и library.
Протестировано с Visual Studio 2017 + Boost v1.70.
Смотрите инструкции по компиляции буста.
Есть несколько вариантов.
- используйте double-double для представления четырехугольника. Например, см. http://www.codeproject.com/Articles/884606/The-double-double-type. Однако тип не соответствует стандарту IEEE. Вы можете определить это, проверив, что его значение epsilon является менее точным, чем стандартное 128-разрядное число с плавающей запятой IEEE, равное 1.926E-34.
- используйте настоящий стандарт IEEE 128-битные числа с плавающей точкой. Компилятор Microsoft VC++ не предоставляет такой тип. Компилятор Intel C++ предоставляет тип _Quad, хотя его реализация еще не завершена (без операций ввода-вывода).
- использовать стороннюю библиотеку. Недавно я создал библиотеку с именем double128, которая основана на Intel C++ _Quad, но добавляет операции ввода-вывода. Работает с Microsoft VC++. Вы можете посетить http://www.cg-inc.com/Product/Double128 для получения дополнительной информации.