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)
#include <quadmath.h>标头以具有宏和函数定义.long double变量定义修改为__float128.__complex128type(quadmath.h)或直接更改typedef _Complex float __attribute__((mode(TC))) _Complex128;__*tf3()).LDBL_*,请将其替换为FLT128_*(完整列表http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)M_PI)或e(M_E),请使用带q后缀(M_*q)的预定义常量,M_PIq和M_Eq(完整列表http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants .html #Typedef-and-constants)Q后缀编写,例如1.3000011111111Q*q版本,例如sqrtq(),sinq()(完整列表http://gcc.gnu.org/onlinedocs/libquadmath/Math-Library-Routines.html#Math-Library-Routines)__float128 strtoflt128 (const char *s, char **sp)- http://gcc.gnu.org/onlinedocs/libquadmath/strtoflt128.html#strtoflt128(警告,在较旧的libquadmath中,strtoflt128中可能存在一些错误,请进行双重检查)__float128是在quadmath_snprintf功能的帮助下完成的.在具有最近glibc的linux发行版上,libquadmath将自动注册该函数以处理Q(也可能q)a, A, e, E, f, F, g, G所有printfs/sprintfs中的转换说明符的长度修饰符,就像它对L长双精度一样.示例:printf ("%Qe", 1.2Q),http://gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html#quadmath_005fsnprintf您还应该知道,因为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)