微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

嵌套函数指针或函数组合

如何解决嵌套函数指针或函数组合

我正在研究微积分运算的 C 实现(例如导数、积分等...)。例如,这里是我的 derivative 函数的模板定义:

double derivative(double (*f)(double),double x);

假设我想计算 exp 在 1 处的导数,那么调用将是:derivative(exp,1);

非常基本的东西。现在我的问题是,我将如何(如果可能的话)将合成传递给我的 derivative 函数?我试图通过 exp(cos) 这让我

error: passing 'double (double)' to parameter of incompatible type 'double'

我该怎么做?甚至有可能吗?

解决方法

我想你是在要求这个:

double composition(double x) {
   return exp(cos(x));
}

derivative(composition,1);

许多语言允许您执行以下操作,但 C 没有匿名函数:

derivative(x => exp(cos(x)),1);
,

C 没有任何函数组合操作。要计算 exp∘cos 的导数,您可以定义一个函数 expcos:

double expcos(double x) 
{
    return exp(cos(x));
}

并取其导数。

对于更通用的解决方案,您可以修改您的派生例程,以采用函数指针和 const void * 来转发到函数。该函数会将 const void * 作为参数,将其转换为指向该函数特定类型的 const 结构的指针,并从该结构中获取数据。然后可以使用 compose 函数实现函数组合,该函数使用包含两个函数指针的结构。但是,这意味着您需要为普通函数(如 expcos)使用代理例程,这些函数接受但忽略 const void *

,

如果您想对组合进行某种运行时控制,您可以编写一个函数,将函数指针数组计算为组合:

// calls functions in reverse order
double compose(size_t n,double (* const fc[])(double),double x)
{
    while (n--)
    {
        x = fc[n](x);
    }
    return x;
}

这可以从您的衍生函数的另一个版本调用:

double derivative_composed(size_t n,double x)
{
    // Example implementation for illustrative purpose only.
    double fx,fxh,h;
    h = x / 1e10;
    if (h == 0)
    {
        h = 1e-10;
    }
    fx = compose(n,fc,x);
    fxh = compose(n,x + h);
    return (fxh - fx) / h;
}

为避免重复代码,您的原始 derivative 函数可以更改为使用单个函数调用 derivative_composed 的包装器:

double derivative(double (* const f),double x)
{
    return derivative_composed(1,&f,x);
}

示例用法:

int main(void)
{
    double (* const fc[2])(double) = { exp,cos };
    double x = 1.0;
    double xprime = derivative_composed(2,x);
    printf("x = %f,xprime = %f\n",x,xprime);
}

输出:

x = 1.000000,xprime = -1.444407

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。