2011-03-27 19 views
11

Kısa bir süre önce GCC 4.6.0, libquadmath ile birlikte ortaya çıktı. Ne yazık ki, GNU Fortran'ı destekledi, ancak C veya C++'u desteklemedi (hepsi dahil edilmiş .so). Bu yeni özellikleri C++ 'da kullanmanın bir yolunu bulamadım, ancak GNU C, garantili dört hassasiyetli şamandıralar için __float128 tipini destekliyor. GNU C, libquadmath, fabsq (mutlak değer, q dörtlü için son ek) gibi matematik işlevlerini desteklemiyor gibi görünmektedir.C++ (GCC) 'deki Dörtlü Hassasiyet

Bu işlevlerin C++ ile çalışmasını sağlamanın bir yolu var mı, yoksa __float128 ile matematik işlevleri için kullanabileceğim başka bir kitaplık var mı? GCC'de çalışan dört-hassas şamandıralar elde etmek için en iyi yöntem nedir? Şimdi bunları ekleyebilir, çıkartabilir ve çarpabilirim, fakat bu benim için işe yaramıyor, bunları string'lere dönüştürmenin hiçbir yolu olmadığımı düşünerek veya kendi string işlevimi oluşturmak için truncq ve fabsq gibi işlevleri kullanmam.

+4

Tam olarak ne çalışmıyor? –

+0

Matematik fonksiyonları kendileri. Şamandıraları ekleyebilir ve çıkartabilirim, ancak 'sinq', 'cosq', 'absq', vb. Gibi matematik fonksiyonlarını kullanamıyorum. Q dörtlünün son ekidir. –

+4

Ne kadar? beyan edilmeyen işlev bağlayıcı hatası? çöp dönüş değeri? Onları C dilinde kullanabilir misin? –

cevap

7

Görünüşe göre, bu benim açımdan bir yükleme hatası olmuş gibi görünmektedir.

GCC'nin çekirdek C/C++ kısmı libquadmath.so içerdiği halde, Fortran sürümü, işlevlere erişmek için dahil edilebilen libquadmath.a ve quadmath.h sağlar.

#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 dosyasını ve hangi işlev adlarının gerçekten olduğunu görün. IIRC, fortran rutinleri adının sonunda _ var. C++’da, "C" yordamları extern gerekir. Bu daha sonra tüm args başvuruya göre iletilir bir fortran arayüzü,, yani proto olabilir Eğer bir şey

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

Bu, ancak aşağıdaki alt çizgi olmadan çalışır. –

+0

tam olarak. Bu yüzden, tüm dışsal tanımları kapsüllemek için bir başlık dosyası yazdım ve sınıfı, yüzer tip sınırları, istisnalar, vb. Için tanımladım. Bu bir acı ... Özellikle << cout >> doğal olarak çalışmak için. Umarım, birisi bana küçük bir sorunla yardım ederse ... Herkesin paylaşması için başlıkları serbest bırakacağım. :: https://stackoverflow.com/questions/48591596/trade-128bit-math-headers-for-user-defined-functions-in-muparser – user2133679