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

如何在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

我有一个中等大小的C99程序,它使用
长双精度
类型(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
的替代品。