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


就在最近,GCC 4.6.0随之而来 libquadmath。不幸的是,GNU支持Fortran,但不支持C或C ++(包括的所有内容都是.so)。我还没有找到在C ++中使用这些新功能的方法,但GNU C确实支持 __float128 保证四倍精度浮点数的类型。 GNU C似乎不支持数学函数 libquadmath这样的 fabsq (绝对值, q 是quad的后缀)。

有没有办法让这些函数在C ++中运行,或者是否有一些替代库可以用于数学函数 __float128?在GCC中使用四倍精度浮子的最佳方法是什么?现在,我可以添加,减去和相乘它们,但这对我来说没用,考虑到我无法将它们转换为字符串或使用诸如 truncq 和 fabsq 创建自己的字符串函数。


8298
2018-03-27 18:44


起源

究竟什么不起作用? - Karl von Moor
怎么会这样?未申报的功能?链接器错误?垃圾回收价值?你能在C中使用它们吗? - David X
@RetroX:你错过了头文件吗?获取链接器错误?尝试使用这些功能时到底出了什么问题? (基本上是Polybos和David X所说的) - Ben Voigt
@RetroX:你仍然没有解释你的意思“似乎不支持数学函数”。当你试着打电话时会发生什么 fabsq(qx),哪里 qx 显然是四精度浮子? - Ben Voigt
通过解释,我们的意思是请发布您尝试编译的示例代码以及您收到的任何/所有错误。有一个 quadmath.h 您可以包含的标题(并在文档中引用)。以下是您可以尝试为我们编译的一些示例源: gcc.gnu.org/onlinedocs/libquadmath/quadmath_005fsnprintf.html - user7116


答案:


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

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

7
2018-03-29 02:04





nm .so文件,看看真正的函数名称。 IIRC,fortran例程有一个名字的末尾。在C ++中,您需要extern“C”{}原型。如果这是一个fortran接口,则所有args都通过引用传递,因此proto可能就像

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

4
2018-03-29 01:18



这有效,但没有以下下划线。 - RétroX
究竟。这就是为什么我写一个头文件来封装所有extern定义,并为浮动类型限制,异常等定义类。这是一个痛苦...特别是让cin << cout >>自然地工作。希望如果有人帮助我解决一个小问题...我会发布标题供所有人分享。 :: stackoverflow.com/questions/48591596/... - Andrew of Scappoose