我认为你对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)的方法。
另外,您需要确保当您需要f的导数时,调用df方法。如果您错误地调用了g的导数方法,则结果将不正确。
但是,我们可以近似计算给定x的f(x)的导数:
float d (float (*f) (float x), 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; }
float df (float x) { return 2.0f * x + 4.0f; }
float ddf (float x) { return 2.0f; }
};
并将该类的实例传递给级数展开程序:
float Series (Function &f, float x)
{
return f.f (x) + f.df (x) + f.ddf (x); // series = f(x) + f'(x) + f''(x)
}
不过,我们仍然需要自己创建函数导数的方法,但至少我们不会意外调用错误的方法。
现在,正如其他人所说,游戏往往更注重速度,因此许多数学问题都被简化了:插值、预先计算的表格等等。