Я думаю, что есть фундаментальная проблема с вашим пониманием самого языка C ++. Функции в C ++ не совпадают с математическими функциями. Итак, в C ++ вы можете определить функцию (которую я теперь буду называть методами, чтобы избежать путаницы) для реализации математической функции:
float f (float x)
{
return x * x + 4.0f * x + 6.0f; // f(x) = x^2 + 4x + 6
}
В C ++ нет способа что-либо сделать с методом f, кроме как получить значение f (x) для данного x. Математическая функция f (x) может быть преобразована довольно легко, например, f '(x), которая в приведенном выше примере является f' (x) = 2x + 4. Для этого в C ++ вам нужно определить метод дф (х):
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, ваши результаты будут неверными.
Мы можем, однако, приблизить производную f (x) для данного 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)
}
но нам все еще нужно создать метод для производной функции самостоятельно, но, по крайней мере, мы не собираемся случайно вызывать неправильный.
Теперь, как утверждают другие, игры, как правило, предпочитают скорость, поэтому многие математические операции упрощены: интерполяция, предварительно вычисленные таблицы и т. Д.