Подтвердить что ты не робот

Как использовать Gcc 4.6.0 libquadmath и __float128 на x86 и x86_64

У меня есть программа C99 среднего размера, которая использует метод long double (80 бит) для вычисления с плавающей запятой. Я хочу улучшить точность с помощью нового расширения GCC 4.6 __float128. Как я понял, это математическая математика с 128-битной точностью.

Как мне преобразовать мою программу из классического длинного двойного 80-битного в четырехъядерные поплавки 128 бит с программной эмуляцией полной точности? Что мне нужно изменить? Флаги компилятора, источники?

Моя программа считывает значения полной точности с помощью strtod, выполняя на них много разных операций (например, + - */sin, cos, exp и другие из <math.h>) и printf.

PS: несмотря на то, что float128 объявлен только для Fortran (REAL * 16), libquadmath написан на C, и он использует float128. Я не уверен, что GCC конвертирует операции с float128 в библиотеку времени выполнения или нет, и я не уверен, как переносить из long double в __float128 в моих источниках.

PPS: есть документация по режиму gcc в режиме "C": http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html

"Компилятор GNU C поддерживает... плавающие типы 128 бит (TFmode). Поддержка дополнительных типов включает в себя арифметические операторы: добавлять, вычитать, умножать, делить, унарные арифметические операторы, реляционные операторы; операторы равенства... Типы __float128 поддерживаются на i386, x86_64"

4b9b3361

Ответ 1

Как мне преобразовать мою программу из классического длинного двойного 80-битного в четырехъядерные поплавки 128 бит с программной эмуляцией полной точности? Что мне нужно изменить? Флаги компилятора, источники?

Вам нужно последнее программное обеспечение, версия GCC с поддержкой типа __float128 (4.6 и новее) и libquadmath (поддерживается только в x86 и x86_64 целях, в IA64 и HPPA с более новым GCC). Вы должны добавить флаг компоновщика -lquadmath (cannot find -lquadmath' покажет, что у вас нет libquadmath)

  • Добавить заголовок #include <quadmath.h> для определения макросов и функций.
  • Вы должны изменить все определения переменных long double на __float128.
  • Сложные переменные могут быть изменены на __complex128 type (quadmath.h) или напрямую с помощью typedef _Complex float __attribute__((mode(TC))) _Complex128;
  • Все простые арифметические операции автоматически обрабатываются GCC (преобразуются в вызовы вспомогательных функций, таких как __*tf3()).
  • Если вы используете какой-либо макрос, например LDBL_*, замените их на FLT128_* (полный список http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)
  • Если вам нужны определенные константы, такие как pi (M_PI) или e (M_E) с четной точностью, используйте предопределенные константы с суффиксом q (M_*q), например M_PIq и M_Eq ( полный список http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)
  • Пользовательские константы могут быть записаны суффиксом q, например 1.3000011111111Q
  • Все вызовы математических функций должны быть заменены версиями *q, такими как sqrtq(), sinq() (полный список http://gcc.gnu.org/onlinedocs/libquadmath/Math-Library-Routines.html#Math-Library-Routines)
  • Чтение quad-float из строки должно выполняться с помощью __float128 strtoflt128 (const char *s, char **sp) - http://gcc.gnu.org/onlinedocs/libquadmath/strtoflt128.html#strtoflt128 (предупреждение, в старых libquadmaths могут быть некоторые ошибки в strtoflt128, сделать двойная проверка)
  • Печать __float128 выполняется с помощью функции quadmath_snprintf. В дистрибутивах linux с недавним glibc функция будет автоматически зарегистрирована libquadmath для обработки модификатора длины q (может быть также q) спецификаторов преобразования a, A, e, E, f, F, g, G во всех printf s/sprintf s, как это было L для длинных удвоений. Пример: printf ("%Qe", 1.2Q), http://gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html#quadmath_005fsnprintf

Вы также должны знать, что с тех пор, как 4.6 Gfortran будет использовать тип __float128 для DOUBLE PRECISION, если была выбрана опция -fdefault-real-8 и не было опции -fdefault-double-8. Это может быть проблемой, поскольку 128 длинных удвоений намного медленнее, чем стандартный длинный двойной на многих платформах из-за вычисления программного обеспечения. (Спасибо за сообщение от glennglockwood http://glennklockwood.blogspot.com/2014/02/linux-perf-libquadmath-and-gfortrans.html)