gpt4 book ai didi

gcc - 如何在 x86 和 x86_64 上使用 Gcc 4.6.0 libquadmath 和 __float128

转载 作者:行者123 更新时间:2023-12-03 21:21:39 25 4
gpt4 key购买 nike

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

我应该如何使用全精度的软件仿真将我的程序从 80 位的经典 long double 转换为 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 compiler supports ... 128 bit (TFmode) floating types. Support for additional types includes the arithmetic operators: add, subtract, multiply, divide; unary arithmetic operators; relational operators; equality operators ... __float128 types are supported on i386, x86_64"

最佳答案

How should I convert my program from classic long double of 80-bit to quad floats of 128 bit with software emulation of full precision? What need I change? Compiler flags, sources?



您需要最新的软件,支持 __float128 的 GCC 版本type(4.6 和更新版本)和 libquadmath(仅支持 x86 and x86_64 targets ;在 IA64 和 HPPA 中使用更新的 GCC)。您应该添加链接器标志 -lquadmath ( cannot find -lquadmath' 将显示您没有安装 libquadmath)
  • 添加 #include <quadmath.h> header 具有宏和函数定义。
  • 您应该修改所有 long double变量定义到 __float128 .
  • 复杂变量可能会更改为 __complex128输入 ( quadmath.h ) 或直接输入 typedef _Complex float __attribute__((mode(TC))) _Complex128;
  • 所有简单的算术运算都由 GCC 自动处理(转换为辅助函数的调用,如 __*tf3())。
  • 如果您使用任何宏,例如 LDBL_* ,将它们替换为 FLT128_* (完整列表 http://gcc.gnu.org/onlinedocs/libquadmath/Typedef-and-constants.html#Typedef-and-constants)
  • 如果您需要一些具有四倍精度的特定常量,如 pi ( M_PI ) 或 e ( M_E ),请使用预定义的常量 q后缀( M_*q ),如 M_PIqM_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)
  • 从字符串中读取quad-float 应该使用__float128 strtoflt128 (const char *s, char **sp) 完成- http://gcc.gnu.org/onlinedocs/libquadmath/strtoflt128.html#strtoflt128 (警告,在较旧的 libquadmaths 中,strtoflt128 中可能存在一些错误,请仔细检查)
  • 打印 __float128是在 quadmath_snprintf 的帮助下完成的功能。在具有最新 glibc 的 linux 发行版上,libquadmath 将自动注册该函数以处理 Q (也可能是 q ) a, A, e, E, f, F, g, G 的长度修饰符全部转换说明符 printf s/sprintf s,就像以前一样L长 double 。示例:printf ("%Qe", 1.2Q) , http://gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html#quadmath_005fsnprintf

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

    关于gcc - 如何在 x86 和 x86_64 上使用 Gcc 4.6.0 libquadmath 和 __float128,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457385/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com