2012-08-17 19 views
7

GCC 4.5 agregó soporte para los puntos flotantes decimales en la biblioteca de tiempo de ejecución (http://gcc.gnu.org/gcc-4.5/changes.html). Puedo compilar código incluyendo, usando namespace std :: decimal, luego usando decimal64 y demás en el código.Cómo usar punto flotante decimal en Gnu C++ (g ++)?

Desafortunadamente, me falta una biblioteca para vincular el código. No he podido averiguar qué bibliotecas deberían ser necesarias. El soporte de DFP está habilitado en gcc (--enable-decimal-float = dpd)

Además, ¿debería haber alguna forma rápida de proporcionar literales decimales en el código? Por rápido, me refiero a literales definidos por el usuario que son manejados por plantillas y traducidos en tiempo de compilación. No quiero proporcionar dobles que se conviertan en tiempo de ejecución (a pesar del rendimiento y el hecho de que realmente no soporto mover las evaluaciones desde el tiempo de compilación al tiempo de ejecución todavía hay problemas de redondeo ...). Ya encontré el sufijo "df" pero eso no parece ser reconocido por el compilador.

Estoy usando gcc versión 4.7.1 en el objetivo powerpc-ibm-aix7.1.0.0.

mensajes de error del vinculador:

ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatsisd 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatsidd 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatsitd 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_mulsd3 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_muldd3 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_multd3 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatdisd 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatunsdisd 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatdidd 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatunsdidd 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatditd 
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatunsditd 

TIA.

+0

El sufijo literal para '_Decimal64' es' dd' ('df' es para' _Decimal32'), pero eso no explica que el compilador no reconozca lo último (sin mencionar las rutinas DPD). ¿Intentó pasar '--enable-version-specific-runtime-libs' al compilador? –

+0

¿Realmente quiso decir pasar esa opción al compilador? No es reconocido. "g ++ -v" muestra que el compilador en sí está configurado con la opción mencionada. – user1034081

Respuesta

1

Recientemente compilé gcc4.7.1 desde la fuente y tuve problemas con el símbolo __floatunsidf. Esto resultó ser un símbolo requerido por libstdC++. So y se definió en libgcc_s.so. Dado que ambas bibliotecas son provistas por gcc, deberían ser compatibles. En mi caso, todavía tenía un linker para incluir una versión anterior de libgcc_s que había eliminado de mi plataforma de destino. Es probablemente vale la pena hacer

# to find out where libstdc++.so is: 
gcc -print-file-name=libstdc++.so 

# see if it references the symbol you're missing 
readelf -a "path to libstdc++.so" | grep "symbol name" 

y luego hacer lo mismo para libgcc_s para ver si ambos definen el símbolo que se está perdiendo. Nb uno marcará el símbolo como indefinido, así es como el enlazador sabe que es obligatorio.

Cuestiones relacionadas