2010-05-10 3 views
5

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

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

+0

Что касается ints, то арифметика с четностью 128 бит доступна с использованием gcc с использованием типов '__int128_t' и' __uint_128_t'. – rafak

+0

и для fp (gcc> 4.5) есть __float128 с программным эмулированием с плавающей точкой – osgx

ответ

9

x86-64 точность такая же, как у обычного x86. Extended double - 80 бит, используя ISA x87, с добавлением 6 дополняющих байтов. 128-битного FP-оборудования нет.

Программная реализация четырехмерной или расширенной четырехмерной точности может выиграть от команды умножения x86-64 64x64 => 128 целых чисел.

2

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

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

+0

Я делаю сравнения между использованием различной точности и точности результата. – Anycorn

+0

Вы когда-нибудь наблюдали такое поведение? GCC, по крайней мере, я не думаю, что может быть запрещено излучать x87. – Potatoswatter

+1

Potatoswatter: Попробуйте '-msse2 -mfpmath = sse', что должно заставить его использовать инструкции SSE для' double' и 'float' s, хотя, вероятно, он по-прежнему использует инструкции x87 для' long double' s. – caf

4

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

0

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

  1. использовать двойной двойник для представления quad. Например, см. http://www.codeproject.com/Articles/884606/The-double-double-type. Однако тип не подтверждает стандарт IEEE. Вы можете сказать, проверяя, что его значение epsilon менее точное, чем стандартное 128-битное поплавок IEEE, которое составляет 1.926E-34.
  2. использовать истинные стандартные 128-битные поплавки IEEE. Компилятор Microsoft VC++ не предоставляет такого типа. Компилятор Intel C++ предоставляет тип _Quad, хотя его реализация не завершена (без операций ввода-вывода) в это время.
  3. использовать стороннюю библиотеку. Недавно я создал библиотеку с именем double128, которая основана на Intel C++ _Quad, но добавляет операции ввода-вывода. Он работает с Microsoft VC++. Вы можете посетить http://www.cg-inc.com/Product/Double128 для получения дополнительной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^