2017-05-12 2 views
1

Je voudrais utiliser __float128 avec fonction de erf de eigen(), mais found out qu'actuellement il ne supporte que les flotteurs et doubles:En utilisant libquadmath avec eigen

Cette fonction prend en charge float uniquement et doubles types scalaires en C++ 11 mode. Pour prendre en charge d'autres types scalaires, ou float/double en mode non C++ 11 , l'utilisateur doit fournir des implémentations de erf (T) pour tout type scalaire à prendre en charge.

Comme je veux utiliser __float128, je veux compter sur libquadmath s erfqimplementation si cela est possible. Mais comment faire ça? La seule façon (laide?) Que je peux actuellement penser est d'utiliser eigens unaryExpr(). Y a-t-il d'autres possibilités?

Répondre

2

Vous pouvez vous spécialiser Eigen::internal::erf_impl (similaire pour toute autre fonction bien sûr):

#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'; 
    } 
} 

Sortie:

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