Ответ 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)