有一个函数,这个函数有一个是函数指针的参数,怎么返回这个参数变化后的函数指针

debugdebugger 2020-03-04 10:06:48
看到一个问题是
众所周知,近似求函数f(x)的导函数,可以用公式 ( f(x+delta)-f(x) )/delta,为了方便起见,规定delta=1e-4,并且不考虑f(x)不可导的情况。
在C++中,如何建立一个函数,以给定的原函数为参数,返回一个导函数的指针,调用这个指针(并给一个参数x),就可以获得导数值。
例如我们给定sin函数,就应当得到cos函数,调用cos(x)就能得到相应的值。

PS:
如果没有说明白的话,可以看下面的例子。
对于lua语言,允许函数内定义函数,以及函数返回函数,实现方法是:

function df( f )
return function(x)
return ( f(x+delta)-f(x) )/delta
end
end

--假设我们已经定义了一个sin(x)函数
调用导函数方法如:
c=df( sin ) --求出正弦函数的导函数并赋给变量c
c( 1 ) --求出1的余弦


现在就拿这个sin(x)例子来说,先不考虑模板抽像化

typedef double (*f)(double);


//比如下面这个fun函数以函数指针s为参数 ,返回一个函数指针,
//这个指针指向一个,参数是1个double,返回值也是double的函数

double (*fun(f s))(double){

return s;
//如果就这样return ,相当于传入什么函数,就返回什么 比如我在主函数里 f d=fun(sin) ,d还是指向sin
//请问能做到像上面红字描述的那样吗?谢谢
}



}


...全文
211 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2020-03-05
  • 打赏
  • 举报
回复
应该不行,c不支持动态生成函数的。
//你可以传两个参数,一个是函数指针,一个待计算的浮点数,如
typedef double (*fun)(double);
double ldelta = 1e-4;
double dfun(fun f, double x) {
return (f(x+delta)-f(x))/delta;
}
//然后调用
double sin(double x) {return x;} //已知sin函数
double x = dfun(sin, 1);

//或者可以用间接方式实现,如用全局变量,或者用类
//全局变量的方式
typedef double (*fun)(double);
double delta = 1e-4;
fun gdfun; //全局变量
double ddfun(double x) {return (gdfun(x+delta)-gdfun(x))/delta;} //不能动态生成函数就用固定的,通过全局变量改变求导原型
fun df(fun f) {gdfun=f; return ddfun;} //设定全局变量
//调用
double sin(double x) {return x;} //已知sin函数
fun c = df(sin); //这里设定全局变量
double v = c(1); //然后调用

//类的方式
typedef double (*fun)(double);
double delta = 1e-4;
class DFun {
private:
fun org;
public:
DFun(fun f) {org=f;}
double callDf(double x) {
return (org(x+delta)-org(x))/delta;
}
};
//调用
double sin(double x) {return x;} //已知sin函数
DFun df(sin);
df.callDf(1);

仅供参考

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧