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 中获得四精度浮点数的最佳方法是什么?现在,我可以对它们进行加减乘乘,但这对我来说毫无用处,考虑到我无法将它们转换为字符串或使用诸如truncq
和fabsq
之类的函数来创建我自己的字符串函数。
【问题讨论】:
数学函数本身。我可以加减浮点数,但我不能使用数学函数,例如sinq
、cosq
、absq
等。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) 中的四倍精度的主要内容,如果未能解决你的问题,请参考以下文章