我认为您对 C++ 语言本身的理解存在根本问题。C++ 中的函数与数学函数不同。因此,在 C++ 中,您可以定义一个函数(我现在将调用方法以避免混淆)来实现一个数学函数:
float f (float x)
{
return x * x + 4.0f * x + 6.0f; // f(x) = x^2 + 4x + 6
}
在 C++ 中,除了获取给定 x 的 f(x) 值外,没有其他方法可以使用方法 f 做任何事情。数学函数 f(x) 可以很容易地转换,例如 f'(x),在上面的示例中是 f'(x) = 2x + 4。要在 C++ 中执行此操作,您需要定义一个方法df (x):
float df (float x)
{
return 2.0f * x + 4.0f; // f'(x) = 2x + 4
}
你不能这样做:
get_derivative (f(x));
并让方法get_derivative
为您转换方法 f(x)。
此外,您必须确保当您想要调用方法 df 的 f 的导数时。如果您不小心调用了 g 的导数方法,您的结果将是错误的。
然而,对于给定的 x,我们可以近似 f(x) 的导数:
float d (float (*f) (float x), x) // pass a pointer to the method f and the value x
{
const float epsilon = a small value;
float dy = f(x+epsilon/2.0f) - f(x-epsilon/2.0f);
return epsilon / dy;
}
但这是非常不稳定且非常不准确的。
现在,在 C++ 中,您可以在这里创建一个类来提供帮助:
class Function
{
public:
virtual float f (float x) = 0; // f(x)
virtual float df (float x) = 0; // f'(x)
virtual float ddf (float x) = 0; // f''(x)
// if you wanted further transformations you'd need to add methods for them
};
并创建我们特定的数学函数:
class ExampleFunction : Function
{
float f (float x) { return x * x + 4.0f * x + 6.0f; } // f(x) = x^2 + 4x + 6
float df (float x) { return 2.0f * x + 4.0f; } // f'(x) = 2x + 4
float ddf (float x) { return 2.0f; } // f''(x) = 2
};
并将此类的实例传递给系列扩展例程:
float Series (Function &f, float x)
{
return f.f (x) + f.df (x) + f.ddf (x); // series = f(x) + f'(x) + f''(x)
}
但是,我们仍然需要自己为函数的导数创建一个方法,但至少我们不会意外调用错误的方法。
现在,正如其他人所说,游戏倾向于速度,所以很多数学都被简化了:插值、预先计算的表格等。