如何在x86和x86_64上使用Gcc 4.6.0 libquadmath和uu float128
我有一个中等大小的C99程序,它使用如何在x86和x86_64上使用Gcc 4.6.0 libquadmath和uu float128,gcc,floating-point,precision,128-bit,Gcc,Floating Point,Precision,128 Bit,我有一个中等大小的C99程序,它使用长双精度类型(80位)进行浮点计算。我想通过新的GCC4.6扩展提高精度\uuu128。据我所知,这是一个软件模拟128位精度的数学 我应该如何使用全精度软件仿真将我的程序从经典的80位长双精度转换为128位四精度浮点? 我需要换什么?编译器标志,源代码 我的程序使用strtod读取全精度值,对它们执行许多不同的操作(如+-*/sin、cos、exp和中的其他值)和打印它们 PS:尽管float128仅为Fortran(REAL*16)声明,但libquadm
长双精度
类型(80位)进行浮点计算。我想通过新的GCC4.6扩展提高精度\uuu128
。据我所知,这是一个软件模拟128位精度的数学
我应该如何使用全精度软件仿真将我的程序从经典的80位长双精度转换为128位四精度浮点?
我需要换什么?编译器标志,源代码
我的程序使用strtod
读取全精度值,对它们执行许多不同的操作(如+-*/sin、cos、exp和
中的其他值)和打印它们
PS:尽管float128仅为Fortran(REAL*16)声明,但libquadmath是用C编写的,它使用float128。我不确定GCC是否会将float128上的操作转换为运行时库,也不确定如何在我的源代码中从long double迁移到_float128
PPS:有一个关于“C”语言gcc模式的文档:
GNU C编译器支持…128位(TFmode)浮点类型。对其他类型的支持包括算术运算符:加、减、乘、除;一元算术运算符;关系运算符;相等运算符…\uuuuu128类型在i386、x86\u64上受支持
我应该如何使用全精度软件仿真将我的程序从经典的80位长双精度转换为128位四精度浮点?我需要换什么?编译器标志,源代码
您需要最新的软件,GCC版本,支持\uuuu float128
类型(4.6及更新版本)和libquadmath(仅在上支持;在IA64和HPPA中支持较新的GCC)。您应该添加链接器标志-lquadmath
(找不到-lquadmath'
将显示您没有安装libquadmath)
- 添加
#包含
标题以包含宏和函数定义
- 您应该将所有
长双精度
变量定义修改为\uuu128
李>
- 复杂变量可以更改为
\uuuucomplex128
类型(quadmath.h
),或直接使用typedef\uuucomplefloat\uuuu属性(模式(TC))\ucomplex128代码>
- 所有简单的算术运算都由GCC自动处理(转换为调用帮助函数,如
\uu*tf3()
)李>
- 如果使用任何宏,如
LDBL.*
,请将其替换为FLT128.*
(完整列表)
- 如果您需要一些具有四倍精度的特定常数,如pi(
M_-pi
)或e(M_-e
),请使用带有q
后缀(M_*q
)的预定义常数,如M_-PIq
和M_-Eq
(完整列表)
- 用户定义的常量可以使用
Q
后缀编写,如1.300001111111q
- 所有数学函数调用都应替换为
*q
版本,如sqrtq()
,sinq()
(完整列表)
- 从字符串中读取四元浮点应该使用
\uuufloat128 strotflt128(const char*s,char**sp)
-(警告,在旧版本的libquadmaths中,strotflt128中可能有一些错误,请仔细检查)
- 在
quadmath\u snprintf
功能的帮助下,打印\u float128
。在使用最新glibc的linux发行版上,函数将由libquadmath自动注册,以处理Q
(也可能是Q
)所有printf
s/sprintf
s中a、a、e、e、f、f、g、g
转换说明符的长度修饰符,就像长双倍的L
一样。示例:printf(“%Qe”,1.2Q)
您还应该知道,由于4.6 Gfortran将使用\uuuu float128
类型来实现双精度,如果提供了选项-fdefault-real-8
,但没有选项-fdefault-DOUBLE-8
。这可能是个问题,因为在许多平台上,由于软件计算,128长双精度比标准长双精度慢得多。(感谢glennglockwood的帖子)libquadmath在这里,这里是关于这个“GCC现在附带了LGPL许可的libquadmath库,它为具有u float128数据类型的目标提供了四精度数学函数。u float128可用于32位x86、x86-64和安腾体系结构上的目标。”使基本操作由glibc/soft fp
完成,例如\uu subtf3()
使用libquadmath,您可以将其用作strod
的替代品。