2011-03-27 24 views
11

最近,GCC 4.6.0與libquadmath一起出現。不幸的是,GNU支持Fortran,但不支持C或C++(包含的所有內容都是.so)。我還沒有找到在C++中使用這些新功能的方法,但是,GNU C支持保證四倍精度浮點數的類型爲__float128。 GNU C似乎不支持libquadmath中的數學函數,例如fabsq(絕對值,q是quad的後綴)。C++中的四元精度(GCC)

有沒有辦法讓這些函數在C++中工作,或者是否有一些替代庫可用於數學函數__float128?在GCC中獲得四倍精度浮點數的最佳方法是什麼?現在,我可以對它們進行加,減,乘,但是這對我來說沒用,考慮到我沒有辦法將它們轉換爲字符串或使用函數(如truncqfabsq)來創建我自己的字符串函數。

+4

什麼是不工作? – 2011-03-27 19:10:09

+0

數學函數本身。我可以添加和減去浮點數,但是我不能使用數學函數,例如'sinq','cosq','absq'等.Q是quad的後綴。 – 2011-03-27 23:52:00

+4

如何?未申報的功能?鏈接器錯誤?垃圾回收值?你可以在C中使用它們嗎? – 2011-03-28 02:52:22

回答

7

顯然,這似乎一直是我的一部分安裝錯誤。

雖然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

nm .so文件,並查看真正的函數名稱。 IIRC,Fortran例程在名稱末尾有一個_。在C++中,您需要extern「C」{}原型。如果這是一個Fortran接口,那麼所有ARG遊戲按引用傳遞,所以原可能是這樣的

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

這適用,但沒有下面的下劃線。準確地說是 – 2011-03-29 02:03:59

+0

。這就是爲什麼我編寫了一個頭文件來封裝所有的extern定義,並且爲浮動類型的限制,異常等定義了類。這是一種痛苦......尤其是讓cin << cout >>自然地工作。希望如果有人幫我解決了一個小問題......我將發佈標題供大家分享。 :: https://stackoverflow.com/questions/48591596/trade-128bit-math-headers-for-user-defined-functions-in-muparser – user2133679 2018-02-02 23:51:06