2011-06-23 7 views
12

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"

+0

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

+0

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

+1

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. –

Odpowiedz

21

Jak przekonwertować mój program z Classi c długa podwójna liczba bitów od 80 do 128 bitów z emulacją oprogramowania z pełną precyzją? Co muszę zmienić? Flagi kompilatorów, źródła?

Musisz najnowszą wersję oprogramowania, GCC przy wsparciu __float128 typu (4.6 i nowsze) oraz libquadmath (obsługiwanym tylko na x86 and x86_64 targets, w IA64 i HPPA z nowszymi GCC). Należy dodać łącznik flagę -lquadmath (The cannot find -lquadmath' pokaże, że masz zainstalowany bez libquadmath)

Warto również wiedzieć, że od 4,6 gfortran użyje __float128 typ dla podwójnej precyzji, jeśli opcja -fdefault-real-8 dano i nie było opcji -fdefault-double-8. Może to być problem, ponieważ 128-bitowe podwójne jest znacznie wolniejsze niż standardowe podwójne podwójne na wielu platformach z powodu obliczeń programowych. (Dzięki postowi przez glennglockwood http://glennklockwood.blogspot.com/2014/02/linux-perf-libquadmath-and-gfortrans.html)

Powiązane problemy