C++ (GCC) 中的四倍精度

Posted

技术标签:

【中文标题】C++ (GCC) 中的四倍精度【英文标题】:Quadruple Precision in C++ (GCC) 【发布时间】:2011-03-27 18:44:17 【问题描述】:

就在最近,GCC 4.6.0 与libquadmath 一起发布。不幸的是,GNU 支持 Fortran,但不支持 C 或 C++(只包含一个 .so)。我还没有找到在 C++ 中使用这些新功能的方法,但是,GNU C 确实支持 __float128 类型以保证四倍精度浮点数。 GNU C 似乎不支持libquadmath 中的数学函数,例如fabsq(绝对值,q 是quad 的后缀)。

有什么方法可以让这些函数在 C++ 中工作,或者是否有一些替代库可以用于 __float128 的数学函数?在 GCC 中获得四精度浮点数的最佳方法是什么?现在,我可以对它们进行加减乘乘,但这对我来说毫无用处,考虑到我无法将它们转换为字符串或使用诸如truncqfabsq 之类的函数来创建我自己的字符串函数。

【问题讨论】:

数学函数本身。我可以加减浮点数,但我不能使用数学函数,例如sinqcosqabsq 等。Q 是 quad 的后缀。 怎么样?未声明的功能?链接器错误?垃圾返回值?你可以在 C 中使用它们吗? @RetroX:所以你缺少头文件吗?获取链接器错误?当您尝试使用这些功能时,究竟出了什么问题? (基本上是 Polybos 和 David X 所说的) @RetroX:您还没有解释“似乎不支持数学函数”的意思。当您尝试调用fabsq(qx) 时会发生什么,其中qx 显然是一个四精度浮点数? 解释我们的意思是请发布您尝试编译的示例代码以及您收到的任何/所有错误。您可以包含一个 quadmath.h 标头(文档中引用了它)。以下是一些您可以尝试为我们编译的示例源代码:gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html 【参考方案1】:

显然,这似乎是我的安装错误。

虽然 GCC 的核心 C/C++ 部分包括 libquadmath.so,但 Fortran 版本提供了 libquadmath.a 和 quadmath.h,可以包含它们以访问这些函数。

#include <quadmath.h>
#include <iostream>
int main()

  char* y = new char[1000];
  quadmath_snprintf(y, 1000, "%Qf", 1.0q);
  std::cout << y << std::endl;
  return 0;

【讨论】:

【参考方案2】:

nm .so 文件,看看函数名到底是什么。 IIRC,fortran 例程的名称末尾有一个 _。在 C++ 中,您需要 extern "C" 原型。如果这是一个 fortran 接口,那么所有 args 都是通过引用传递的,所以 proto 可能类似于

extern "C"  long double fabsq_(long double* x); 

【讨论】:

完全正确。这就是为什么我写了一个头文件来封装所有的外部定义,并定义了浮动类型限制、异常等的类。这很痛苦……尤其是让 cin > 自然工作。希望,如果有人帮助我解决一个小问题......我会发布标题供大家分享。 ::***.com/questions/48591596/…

以上是关于C++ (GCC) 中的四倍精度的主要内容,如果未能解决你的问题,请参考以下文章

将工作代码从双精度转换为四精度:如何从输入文件中读取 FORTRAN 中的四精度数字

比较 C++ 中的双精度,同行评审

如何在 C++ 中的同一函数中使用字符串和双精度数

如何从c ++中的文件中读取双精度

GPSLocation的四种定位方式说明

Emacs 23 使用的字符集是 Unicode 的四倍——为啥?