17

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

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

我的程序使用 读取全精度值strtod,对它们执行许多不同的操作(如 +-*/ sin、cos、exp 和其他 from <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"

4

1 回答 1

30

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

您需要最新的软件、支持__float128类型(4.6 和更高版本)的 GCC 版本和 libquadmath(仅在x86 和 x86_64 目标上支持;在 IA64 和具有更新 GCC 的 HPPA 中)。您应该添加链接器标志-lquadmath(这cannot find -lquadmath'将表明您没有安装 libquadmath)

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

于 2014-04-04T18:44:02.430 回答