2017-05-12 6 views
1

würde Ich mag mit Eigens erf verwenden __float128() -Funktion, aber found out, die derzeit unterstützt nur floats und doubles:Mit libquadmath mit Eigen

Diese Funktion unterstützt nur float und double skalare Typen in C++ 11 Modus. Um andere Skalartypen zu unterstützen, oder float/double im Nicht-C++ 11 Modus, muss der Benutzer Implementierungen von erf (T) für jeden Skalar Typ T bereitstellen, der unterstützt werden soll.

Als ich verwenden __float128 wollen, möchte ich auf libquadmath s erfqimplementation berufen, wenn dies möglich ist. Aber wie geht das? Die einzige (hässliche?) Weise, die ich derzeit denken kann, ist die Verwendung von Eigenen unaryExpr(). Gibt es andere Möglichkeiten?

Antwort

2

können Sie spezialisieren Eigen::internal::erf_impl (ähnlich für jede andere Funktion natürlich):

#include <quadmath.h> 
#include <iostream> 
#include <unsupported/Eigen/SpecialFunctions> 

namespace Eigen { namespace internal { 
template<> 
struct erf_impl<__float128> { 
    EIGEN_DEVICE_FUNC 
    static EIGEN_STRONG_INLINE __float128 run(__float128 x) { return ::erfq(x); } 
}; 
}} 

int main() 
{ 
    typedef Eigen::Array<__float128, Eigen::Dynamic, 1> ArrayXF; 
    ArrayXF a(4); a << 0, 0.25, 0.5, 0.75; 
    ArrayXF b = a.erf(); 

    for(int i=0; i<4; ++i){ 
     char buf[100]; 
     quadmath_snprintf(buf, 100, "%.50Qe", b[i]); std::cout << buf << '\n'; 
    } 
} 

Ausgang:

0.00000000000000000000000000000000000000000000000000e + 00 2.76326390168236932985068267764815703534647315720851e-01 5.20499877813046537682746653891964513119913394193564e-01 7.11155633653515131598937834591410814324096358715387e -01