2

我正在尝试对一类特别讨厌的函数进行数值积分,最初我使用的是 GSL,但舍入误差对于我想要的公差来说太大了。在快速谷歌搜索任意精度正交库之后,我找到了 quadpack++,它似乎可以满足我的要求,但我无法让它工作,特别是我似乎无法传递这种形式的函数:

mpf MyClass::foo( mpf t, const mpf_array& fourier ){   
    // do stuf
}

作为输入,它希望以这种形式:

template<typename Real, class param_t>
    class Function : public FtnBase<Real> {
public:
    typedef Real defn_t(Real, param_t*);    
    defn_t& function_;
    param_t* params_;

    virtual Real operator() (Real x) {return function_(x, params_); }
    Function(defn_t& function) : function_(function), params_(0) {}
    Function(defn_t& function, param_t* params) : function_(function), params_(params) {}               
    ~Function() {}
};

我对 C++ 很陌生,所以它可能很简单,但我已经尝试了基于Q1Q2可以想到的指针和 std::bind 的所有组合,但无济于事。对此的任何帮助,或对更好测试和记录的任意精度正交库的建议将不胜感激。

4

1 回答 1

1

函数原型必须有两个参数,第二个必须是指针。我不知道mpf_array它归结为什么。如果它不是指针类型,那是个问题。(还有一些测试表明,const在参数前面没有帮助。)

可能更重要的是,它必须是一个自由函数,并且不能属于一个类MyClass(除非它是一个静态函数 IIRC)。您需要MyClass函数内部的元素吗?

(根据下面的评论进行编辑)。显示的函数原型需要一个(可能是真实的)类型和一个指向所有其他参数的指针,对您而言,这不仅需要这个 mpf_array 事物,还需要您需要从中调用它的 MyClass 对象。所以你需要将所有这些参数打包成一个大的……东西。

struct helper {
    mpf_array foo;
    MyClass bob;
}

然后我们可以创建一个中继函数,将其中一个打包为您需要的参数:

mpf relay(mpf t, helper* args) {
    return args->bob.actual_function(t, args->foo);
}

然后使用您的数组和实际对象创建一个辅助结构,fourier并将其地址作为第二个参数传递。这里可能应该有一些参考资料以避免复制,但我直接在这个框中输入(所以这里可能还有其他一些错误)。

这是......充其量是hackish,但无论如何它应该可以完成这个包的工作。(我不得不承认我不知道有什么更适合的套餐,抱歉。)

于 2014-01-11T00:04:46.137 回答