2011-06-23 15 views
12

Tengo un programa de tamaño medio C99 que usa el tipo long double (80 bits) para el cálculo en coma flotante. Quiero mejorar la precisión con la nueva extensión GCC 4.6 __float128. Según entiendo, es una matemática de precisión de 128 bits emulada por software.Cómo usar Gcc 4.6.0 libquadmath y __float128 en x86 y x86_64

¿Cómo debo convertir mi programa de doble larga clásica de 80 bits a cuádruple flotadores de 128 bits con emulación de software de precisión total? ¿Qué necesito cambiar? Banderas del compilador, fuentes?

Mi programa tienen la lectura de los valores de plena precisión con strtod, haciendo un montón de diferentes operaciones sobre ellos (como + - */sen, cos, exp y otra de <math.h>) y printf -ing de ellos.

PD: a pesar de que float128 está declarado solo para Fortran (REAL * 16), el libquadmath está escrito en C y usa float128. No estoy seguro si GCC convertirá las operaciones en float128 a la biblioteca de tiempo de ejecución o no y no estoy seguro de cómo migrar de doble largo a __float128 en mis fuentes.

PPS: Hay una documentación sobre "C" modo de idioma gcc: http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html

"compilador GNU C soporta ... 128 bits (TFmode) tipos flotantes soporte para tipos adicionales incluye los operadores aritméticos.: sumar, restar, multiplicar, dividir; operadores aritméticos unitarios; operadores relacionales; operadores de igualdad ... __float128 tipos son compatibles en i386, x86_64"

+0

libquadmath está aquí http://gcc.gnu.org/onlinedocs/libquadmath/index.html#toc_Top y aquí hay novedades sobre este http://gcc.gnu.org/gcc -4.6/changes.html "GCC ahora viene con la biblioteca libquadmath con licencia LGPL, que proporciona funciones matemáticas de precisión cuádruple para los objetivos con un tipo de datos __float128. __float128 está disponible para los objetivos en las arquitecturas x86, x86-64 e Itanium de 32 bits. " – osgx

+0

activar que las operaciones básicas se realicen con' glibc/soft-fp', por ejemplo '__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

usando libquadmath, puede usar [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) como un sustituto 'strtod' ent. –

Respuesta

21

¿Cómo debo convertir mi programa de clasificación ¿c largo doble de 80 bit a quad flota de 128 bit con emulación de software de precisión total? ¿Qué necesito cambiar? Banderas del compilador, fuentes?

se necesita un software reciente, versión de GCC con el apoyo de __float128 tipo (4.6 y posteriores) y libquadmath (compatible sólo con x86 and x86_64 targets; en IA64 y HPPA con nuevo GCC). Usted debe agregar el indicador de enlazador -lquadmath (el cannot find -lquadmath' mostrará que ha instalado ningún libquadmath)

También debe saber, que desde 4.6 gfortran utilizará __float128 tipo para doble precisión, si la opción -fdefault-real-8 se le dio y no había ninguna opción -fdefault-double-8. Esto puede ser un problema, ya que 128 long double es mucho más lento que el double estándar doble en muchas plataformas debido al cálculo del software. (Gracias a la publicación de glennglockwood http://glennklockwood.blogspot.com/2014/02/linux-perf-libquadmath-and-gfortrans.html)

Cuestiones relacionadas