2011-03-27 21 views
11

Recientemente, salió GCC 4.6.0 junto con libquadmath. Desafortunadamente, GNU ha sido compatible con Fortran, pero no con C o C++ (todo lo que se incluye es un .so). No he encontrado una manera de utilizar estas nuevas características en C++, sin embargo, GNU C no admite el tipo __float128 para flotadores de cuádruple precisión garantizados. GNU C no parece soportar las funciones matemáticas en libquadmath, tales fabsq (valor absoluto, q siendo el sufijo para quad).Cuádruple precisión en C++ (GCC)

¿Hay alguna forma de que estas funciones funcionen en C++, o hay alguna biblioteca alternativa que pueda usar para las funciones matemáticas con __float128? ¿Cuál es el mejor método para hacer que las flotadores de precisión cuádruple trabajen en el CCG? En este momento, puedo sumar, restar y multiplicar, pero esto es inútil para mí, considerando que no tengo forma de convertirlos a cadenas o usar funciones como truncq y fabsq para crear mi propia función de cadena.

+4

¿Qué exactamente no está funcionando? –

+0

Las funciones matemáticas en sí mismas. Puedo agregar y restar los flotantes, pero no puedo usar funciones matemáticas como 'sinq',' cosq', 'absq', etc. Q es el sufijo de quad. –

+4

¿Cómo es eso? función no declarada error de enlazador? valor de retorno de basura? ¿Puedes usarlos en C? –

Respuesta

7

Al parecer, esto parece haber habido un error de instalación de mi parte.

Mientras que la parte central de C/C++ del GCC incluye libquadmath.so, la versión de Fortran proporciona libquadmath.a y quadmath.h, que se pueden incluir para acceder a las funciones.

#include <quadmath.h> 
#include <iostream> 
int main() 
{ 
    char* y = new char[1000]; 
    quadmath_snprintf(y, 1000, "%Qf", 1.0q); 
    std::cout << y << std::endl; 
    return 0; 
} 
4

nm en el archivo .so, y vea qué nombres de funciones realmente son. IIRC, las rutinas fortran tienen un _ al final del nombre. En C++, necesitarás externar prototipos "C" {}. Si se trata de una interfaz de Fortran, entonces todos los argumentos se pasan por referencia, por lo proto podría ser algo como

extern "C" { long double fabsq_(long double* x); } 
+0

Esto funciona, pero sin el siguiente guión bajo. –

+0

exactamente. Es por eso que escribí un archivo de cabecera para encapsular todas las definiciones externas, y definí la clase para los límites de tipo flotante, excepciones, etc. Es un dolor ... especialmente conseguir que cin << cout >> funcione naturalmente. Con suerte, si alguien me ayuda con un problema menor ... lanzaré los encabezados para que todos los compartan. :: https://stackoverflow.com/questions/48591596/trade-128bit-math-headers-for-user-defined-functions-in-muparser – user2133679