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

14
最近,GCC 4.6.0与libquadmath一同发布。不幸的是,GNU支持Fortran,但不支持C或C++(只包含.so文件)。我没有找到在C++中使用这些新功能的方法,然而,GNU C支持__float128类型以保证四倍精度浮点数。GNU C似乎不支持libquadmath中的数学函数,例如fabsq(绝对值,q是quad的后缀)。
有没有办法让这些函数在C++中工作?或者是否有某个替代库可用于带有__float128的数学函数?获取四倍精度浮点数在GCC中的最佳方法是什么?现在,我可以将它们相加、相减和相乘,但这对我来说毫无用处,因为我没有办法将它们转换为字符串或使用truncqfabsq等函数创建自己的字符串函数。

4
怎么回事?未声明的函数?链接错误?垃圾返回值?它们在C语言中能用吗? - David X
2
@RetroX:你是不是缺少头文件?出现链接器错误了吗?当你尝试使用这些函数时到底出了什么问题?(基本上就是Polybos和David X所说的) - Ben Voigt
3
您还没有解释"不支持数学函数"的含义。当您尝试调用fabsq(qx)时会发生什么情况?这里的qx显然是四倍精度浮点数。 - Ben Voigt
1
我们所说的“解释”是请发布您尝试编译的示例代码以及您收到的所有错误。您可以包含一个quadmath.h头文件(并且在文档中引用它)。这里有一些示例源代码,您可以尝试为我们编译:http://gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html - user7116
这个用户遇到的问题非常普遍。截至2017年底,quadlib库没有按预期方式扩展math.h和cmath库头文件。我编写了特殊的头文件,包含所有C++重载,以便使用math.h和<cmath>的普通程序可以进行最小更改地编译quadlib,并愿意交换代码。请参见:https://stackoverflow.com/questions/48591596/trade-128bit-math-headers-for-user-defined-functions-in-muparser - Andrew of Scappoose
显示剩余3条评论
2个回答

10

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

虽然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;
}

4

查看.so文件,了解函数名称。如果是Fortran程序,名称末尾会有一个下划线。在C++中,您需要使用extern "C" {}原型。如果这是Fortran接口,则所有参数都通过引用传递,因此原型可能类似于:

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

这就是为什么我编写了一个头文件来封装所有的extern定义,并为浮点类型限制、异常等定义了类。这很痛苦...特别是让cin << cout >>自然工作。希望如果有人能帮我解决一个小问题...我会发布这些头文件供大家共享。 :: https://stackoverflow.com/questions/48591596/trade-128bit-math-headers-for-user-defined-functions-in-muparser - Andrew of Scappoose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接