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 "

Author: osgx, 2011-06-23

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)

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)

 22
Author: osgx,
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