Jak używać Gcc 4.6.0 libquadmath i float128 na x86 i x86 64
Mam program średniej wielkości C99, który używa typu long double
(80bit) do obliczeń zmiennoprzecinkowych. Chcę poprawić precyzję dzięki nowemu rozszerzeniu gcc 4.6 __float128
. Jak rozumiem, jest to emulowana programowo 128-bitowa precyzyjna matematyka.
Jak mam przekonwertować mój program z klasycznego długiego podwójnego 80-bitowego na quadowy pływak 128-bitowy z emulacją oprogramowania z pełną precyzją? Co muszę zmienić? Flagi kompilatora, źródła?
Mój program ma odczyt pełnych wartości dokładności z strtod
, robiąc wiele różnych operacji na nich (jak + - * / sin, cos, exp i inne z <math.h>
) i printf
- ing z nich.
PS: pomimo tego, że float128 jest zadeklarowany tylko dla Fortran (REAL*16), libquadmath jest napisany w C i używa float128. Nie jestem pewien, czy GCC konwertuje operacje na float128 do biblioteki runtime, czy nie i nie jestem pewien, jak przenieść z long double do _ _ float128 w moich źródłach.
PPS: istnieje dokumentacja dotycząca trybu GCC języka "C": http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
"kompilator GNU C obsługuje ... 128-bitowe (TFmode) typy pływające. Obsługa dodatkowych typów obejmuje operatory arytmetyczne: dodawanie, odejmowanie, mnożenie, dzielenie; operatory arytmetyczne jednoargumentowe; operatory relacyjne; operatory równości ... _Typy _float128 są obsługiwane na i386, x86_64 "
1 answers
Jak mam przekonwertować mój program z klasycznego długiego podwójnego 80-bitowego na quadowy pływak 128-bitowy z emulacją oprogramowania z pełną precyzją? Co muszę zmienić? Flagi kompilatora, źródła?
Potrzebujesz najnowszego oprogramowania, wersji GCC z obsługą typu __float128
(4.6 i nowsze) oraz libquadmath (wspierane tylko na obiektach x86 i x86_64 ; w IA64 i HPPA z nowszymi GCC). Powinieneś dodać flagę linkera -lquadmath
(cannot find -lquadmath'
pokaże, że nie masz libquadmath zainstalowane)
- Dodaj nagłówek
#include <quadmath.h>
, aby mieć definicje makr i funkcji. - należy zmodyfikować wszystkie definicje zmiennych
long double
na__float128
. - zmienne złożone mogą być zmienione na typ
__complex128
(quadmath.h
) lub bezpośrednio ztypedef _Complex float __attribute__((mode(TC))) _Complex128;
- wszystkie proste operacje arytmetyczne są automatycznie obsługiwane przez GCC(konwertowane na wywołania funkcji pomocniczych, takich jak
__*tf3()
). - Jeśli używasz makra podobnego do
LDBL_*
, zastąp jeFLT128_*
(pełna lista http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants) - jeśli potrzebujesz określonych stałych, takich jak pi (
M_PI
) lub e (M_E
) z poczwórną precyzją, użyj predefiniowanych stałych z przyrostkiemq
(M_*q
), takich jakM_PIq
iM_Eq
(pełna lista http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants) - stałe zdefiniowane przez Użytkownika mogą być zapisywane za pomocą przyrostka
Q
, Jak1.3000011111111Q
- wszystkie wywołania funkcji matematycznych powinny być zastąpione wersjami
*q
, Jaksqrtq()
,sinq()
(pełna lista http://gcc.gnu.org/onlinedocs/libquadmath/Math-Library-Routines.html#Math-Library-Routines) - odczyt Quad-float z string powinien odbywać się za pomocą
__float128 strtoflt128 (const char *s, char **sp)
- http://gcc.gnu.org/onlinedocs/libquadmath/strtoflt128.html#strtoflt128 (Uwaga, w starszych libquadmaths mogą być jakieś błędy w strtoflt128, zrób podwójne sprawdzenie) - Drukowanie
__float128
jest wykonane przy pomocyquadmath_snprintf
funkcji. W dystrybucjach Linuksa z najnowszymi glibc funkcja będzie automatycznie rejestrowana przez libquadmath do obsługiQ
(może być równieżq
) modyfikatora długości dlaa, A, e, E, f, F, g, G
specyfikacji konwersji we wszystkichprintf
s/sprintf
s, tak jak to miało miejsceL
Dla long doubles. Przykład:printf ("%Qe", 1.2Q)
, http://gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html#quadmath_005fsnprintf
Powinieneś też wiedzieć, że od 4.6 Gfortran będzie używał __float128
typu dla Podwójna precyzja, jeśli podano opcję -fdefault-real-8
i nie było opcji -fdefault-double-8
. Może to być problem, ponieważ 128 long double jest znacznie wolniejszy niż standardowy long double na wielu platformach ze względu na obliczenia programowe. (Thanks to post by glennglockwood http://glennklockwood.blogspot.com/2014/02/linux-perf-libquadmath-and-gfortrans.html)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 18:51:45