Mam program średniej wielkości C99, który używa typu long double
(80bit) do obliczeń zmiennoprzecinkowych. Chcę poprawić precyzję z nowym rozszerzeniem GCC 4.6 __float128
. Jak się okazuje, jest to 128-bitowa precyzyjna matematyka oparta na oprogramowaniu.Jak używać Gcc 4.6.0 libquadmath i __float128 na x86 i x86_64
Jak skonwertować program z klasycznego long double 80-bitowego na quadowe 128-bitowe z emulacją oprogramowania z pełną precyzją? Co muszę zmienić? Flagi kompilatorów, źródła?
Mój program ma odczyt pełnej wartości dokładności z strtod
, robi wiele różnych operacji na nich (tak jak + - */sin, cos, exp i drugiej z <math.h>
) i printf
-ing z nich.
PS: mimo ż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 na bibliotekę wykonawczą, czy nie, i nie jestem pewien, jak przenieść z długich kopii do __float128 w moich źródłach.
PPS: Nie ma dokumentacji na "C" trybie język gcc: http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
„kompilator GNU C wspomaga ... 128 bit (TFmode) pływających typów Wsparcie dla dodatkowych typów zawiera operatory arytmetyczne.: dodawanie, odejmowanie, mnożenie, dzielenie; unarne operatory arytmetyczne; operatory relacyjne; operatorów równości ... __float128 typy są obsługiwane na i386, x86_64"
libquadmath jest tutaj http://gcc.gnu.org/onlinedocs/libquadmath/index.html#toc_Top i tutaj są wiadomości o tym http://gcc.gnu.org/gcc -4.6/changes.html "GCC jest teraz dostarczany z licencjonowaną biblioteką libquadmath, która zapewnia quad-precyzję matematycznych funkcji dla obiektów docelowych z typem __float128. __float128 jest dostępny dla obiektów docelowych w 32-bitowych architekturach x86, x86-64 i Itanium. " – osgx
Przekształć podstawowe operacje za pomocą' glibc/soft-fp', np. '__subtf3()' http://koala.cs.pub.ro/lxr/#glibc+2.9/soft-fp/subtf3.c# L35 http://gcc.gnu.org/wiki/Software_floating_point – osgx
używając libquadmath, możesz użyć [strtoflt128] (http://webcache.googleusercontent.com/search?q=cache:P0PwG_dRv4EJ:gcc.gnu.org/onlinedocs /libquadmath.ps.gz+&cd=1&hl=en&ct=clnk&client=ubuntu) jako "strtod' replacem ent. –