如何在x86和x86_64上使用Gcc 4.6.0 libquadmath和__float128

osg*_*sgx 14 floating-point precision gcc 128-bit

我有中等大小的C99程序,它使用long double类型(80位)进行浮点计算.我想用新的GCC 4.6扩展来提高精度__float128.我得到的是,它是一个软件模拟的128位精度数学.

我应该如何使用全精度的软件仿真将我的程序从80位的经典长双精度转换为128位的四重浮点数?我需要改变什么?编译器标志,来源?

我的程序读取了全精度值strtod,对它们进行了很多不同的操作(比如+ - */sin,cos,exp和其他<math.h>)和printf-ing.

PS:尽管float128仅针对Fortran(REAL*16)声明,但libquadmath是用C语言编写的,它使用float128.我不确定GCC会将float128上的操作转换为运行时库吗?我不确定如何在我的源代码中从long double迁移到__float128.

PPS:有关于"C"语言gcc模式的文档:http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html

"GNU C编译器支持... 128位(TFmode)浮点类型.支持其他类型包括算术运算符:加,减,乘,除 ;一元算术运算符;关系运算符;等于运算符... __float128类型支持i386,x86_64"

osg*_*sgx 26

我应该如何使用全精度的软件仿真将我的程序从80位的经典长双精度转换为128位的四重浮点数?我需要改变什么?编译器标志,来源?

您需要最新的软件,GCC版本支持__float128类型(4.6和更高版本)和libquadmath(仅支持x86和x86_64目标 ; IA64和HPPA支持更新的GCC).你应该添加链接器标志-lquadmath(cannot find -lquadmath'将显示你没有安装libquadmath)

您还应该知道,因为4.6 Gfortran将使用__float128类型进行双精度,如果-fdefault-real-8给出了选项并且没有选项-fdefault-double-8.这可能是个问题,因为由于软件计算,128 long double比许多平台上的标准long double慢得多.(感谢glennglockwood的帖子http://glennklockwood.blogspot.com/2014/02/linux-perf-libquadmath-and-gfortrans.html)