gpt4 book ai didi

c++ - 在 C++ 中使用带有模板参数的标准数学函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:12 39 4
gpt4 key购买 nike

我写的代码:

const double PI = 3.141592653589793;

namespace
{
const int N = 8;
const double points[8] = {-0.9602898564975363, -0.7966664774136267, -0.5255324099163290, -0.1834346424956498,
0.1834346424956498, 0.5255324099163290, 0.7966664774136267, 0.9602898564975363};
const double weights[8] = {0.1012285362903706, 0.2223810344533744, 0.3137066458778874, 0.3626837833783621, 0.3626837833783621,
0.3137066458778874, 0.2223810344533744, 0.1012285362903706};
const double error = 1e-10;

template <class TFunction, class TNumber>
class ChangeOfVariables
{
TFunction f;
public:
ChangeOfVariables(TFunction f) : f(f){}
TNumber operator() (TNumber x) { TNumber c=std::cos(x); return f(std::tan(x))/(c*c); }
};
}


class Quadrature
{
public:
Quadrature(void) {};
~Quadrature(void) {};

template <class TFunction, class TNumber>
TNumber integrate(TFunction f, TNumber a, TNumber b)
{
TNumber result = 0.0;
for(int i=0; i<N; i++)
{
result+= weights[i]*f(0.5*((b-a)*points[i]+(a+b)));
}
return 0.5*(b-a)*result;
}

template <class TFunction, class TNumber>
TNumber integrateToInfty(TFunction f, TNumber a)
{
using std::atan;
return integrate<ChangeOfVariables<TFunction,TNumber>, TNumber>(ChangeOfVariables<TFunction,TNumber>(f), atan(a), PI/2);
}
};

这里用到:

double dampendedExp(double x) {return std::exp(-2.0*x);}
int main()
{
Quadrature quadrature;
cout<<"e^(-2x)="<<quadrature.integrateToInfty(dampendedExp, 0)<<endl;
}

但是编译器提示:

Error   1   error C2668: 'atan' : ambiguous call to overloaded function c:\users\ga1009\documents\dev\fouriertransform\fouriertransform\quadrature.h    48

我们的想法是让它适用于不同的数字类型,例如doublecomplex<double> ,其中定义了 atan。我该如何解决?

最佳答案

Visual Studio 将解释 0作为一个整数,在调​​用 std::atan 时失败因为它不知道应该将整数转换为哪种浮点类型(floatdoublelong double):

~\documents\visual studio 2010\projects\so-atan\so-atan\quadrature.h(44): error C2668: 'atan': ambiguous call to overloaded function           c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(553): can be 'long double atan(long double)'          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(505): or "float atan(float)"          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(108): or "double atan(double)"                    ~\documents\visual studio 2010\projects\so-atan\so-atan\main.cpp(12):          in [...] "TNumber Quadrature::integrateToInfty(TFunction,TNumber)".          with          [              TNumber=int,              TFunction=double (__cdecl *)(double)          ]

You can recreate this behavior yourself very easily:

#include <iostream>

float f(float x){return x;}
double f(double x){return x;}
long double f(long double x){return x;}

int main()
{
std::cout << f(0) << std::endl;
}

这将产生完全相同的错误。要摆脱这种情况,您应该使用特定版本的 std::atan , std::cosstd::tan通过使用 static_cast<double>static_cast<long double>在你的正交中,

template <class TFunction, class TNumber>
TNumber integrateToInfty(TFunction f, TNumber a)
{
using std::atan;
return integrate<ChangeOfVariables<TFunction,TNumber>, TNumber>
(ChangeOfVariables<TFunction,TNumber>(f),
atan(static_cast<long double>(a)), PI/2);
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
}

或者在调用中使用 float 而不是整数(这样更容易):

cout<<"e^(-2x)="<<quadrature.integrateToInfty(dampendedExp, 0.0)<<endl;
// cout<<"e^(-2x)="<<quadrature.integrateToInfty(dampendedExp, static_cast<double>(x))<<endl;

关于c++ - 在 C++ 中使用带有模板参数的标准数学函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10933936/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com