我有中型C99程序,它使用long double类型(80位)进行浮点计算.我想提高精度与新GCC 4.6扩展__float128。据我所知,这是一个软件模拟128位精度的数学.
我应该如何转换我的程序从经典的长双80位到四浮动128位与软件仿真的全精度?我需要换什么?编译器标志,源?
我的程序使用strtod读取完整的精度值,对它们执行许多不同的操作(比如+-*/ sin、cos、exp和其他来自<math.h>的操作)和printf-ing。
PS:尽管float128只为Fortran声明(REAL*16),但它用C编写,并使用float128。我不确定GCC是否会将float128上的操作转换为运行时库,我也不知道如何在我的源代码中从long double迁移到__float128。
PPS:有一个关于"C“语言gcc模式的文档:http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
"GNU编译器支持. 128位(TFmode)浮动类型。对其他类型的支持包括算术运算符:加、减、乘、除;一元算术运算符;关系运算符;相等运算符. __float128类型在i386,x86_64"
中得到支持
发布于 2014-04-04 18:44:02
如何将我的程序从经典的长双80位转换成128位的四位浮标,并进行完全精度的软件仿真?我需要换什么?编译器标志,源?
您需要最新的软件,GCC版本,支持__float128类型(4.6和更新版本)和lib44(仅在x86 and x86_64 targets上支持;在IA64和HPPA中支持较新的GCC)。您应该添加链接器标志-lquadmath ( cannot find -lquadmath'将显示您没有安装lib44)
definitions.
#include <quadmath.h>标头以具有宏和函数,将所有long double变量定义修改为__float128。使用typedef _Complex float __attribute__((mode(TC))) _Complex128;__complex128类型(quadmath.h)或直接由GCC (转换为__*tf3()等辅助函数调用)自动处理简单的算术操作。如果使用任何宏(如http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)FLT128_* (完整列表)--您需要使用四重精度的特定常量,如pi (M_PI)或e (M_E);使用带有q后缀(M_*q)的预定义常量,如M_PIq和M_Eq (可以用Q后缀编写完整的列表常量,如1.3000011111111Q
*q版本,如sqrtq(),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来完成(警告,在较旧的lib摄制中,strtoflt128中可能有一些bug,做双check)__float128是借助quadmath_snprintf函数完成的。在最近使用glibc的linux发行版上,该函数将由lib44自动注册,以处理Q (也可能是q)所有printfs/sprintf中的a, A, e, E, f, F, g, G转换说明符的长度修饰符,就像它对长双的L所做的那样。示例:http://gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html#quadmath_005fsnprintf,printf ("%Qe", 1.2Q)
您还应该知道,由于4.6Gfortran将使用__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的帖子)
https://stackoverflow.com/questions/6457385
复制相似问题