#include <iostream>
#include <math.h>
class Function {
private:
float (*function)(float);
public:
Function(float method(float)) : function(method) {}
float eval(float x) {
return function(x);
}
float derive(float x, float error = 0.001) {
return (function(x) - function(x + error)) / error;
}
float integrate(float x0, float x1, float partitions = 100) {
float integral = 0;
float step = (x1 - x0) / partitions;
for(float i = 0; i < partitions; i += step) integral += step * function(i);
return integral;
}
};
float exampleFunction(float x) {
return 2 * pow(x, 2) + 5;
}
int main() {
Function myFunction (exampleFunction);
std::cout << myFunction.eval(6) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgoKY2xhc3MgRnVuY3Rpb24geyAKICAgcHJpdmF0ZToKICAgICAgZmxvYXQgKCpmdW5jdGlvbikoZmxvYXQpOwogICBwdWJsaWM6CiAgICAgIEZ1bmN0aW9uKGZsb2F0IG1ldGhvZChmbG9hdCkpIDogZnVuY3Rpb24obWV0aG9kKSB7fQogICAgICBmbG9hdCBldmFsKGZsb2F0IHgpIHsKICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpOwogICAgICB9CiAgICAgIGZsb2F0IGRlcml2ZShmbG9hdCB4LCBmbG9hdCBlcnJvciA9IDAuMDAxKSB7CiAgICAgICAgIHJldHVybiAoZnVuY3Rpb24oeCkgLSBmdW5jdGlvbih4ICsgZXJyb3IpKSAvIGVycm9yOwogICAgICB9CiAgICAgIGZsb2F0IGludGVncmF0ZShmbG9hdCB4MCwgZmxvYXQgeDEsIGZsb2F0IHBhcnRpdGlvbnMgPSAxMDApIHsKICAgICAgICAgZmxvYXQgaW50ZWdyYWwgPSAwOwogICAgICAgICBmbG9hdCBzdGVwID0gKHgxIC0geDApIC8gcGFydGl0aW9uczsKICAgICAgICAgZm9yKGZsb2F0IGkgPSAwOyBpIDwgcGFydGl0aW9uczsgaSArPSBzdGVwKSBpbnRlZ3JhbCArPSBzdGVwICogZnVuY3Rpb24oaSk7CiAgICAgICAgIHJldHVybiBpbnRlZ3JhbDsKICAgICAgfQp9OwoKCmZsb2F0IGV4YW1wbGVGdW5jdGlvbihmbG9hdCB4KSB7CiAgIHJldHVybiAyICogcG93KHgsIDIpICsgNTsKfQoKCmludCBtYWluKCkgewogICBGdW5jdGlvbiBteUZ1bmN0aW9uIChleGFtcGxlRnVuY3Rpb24pOwogICBzdGQ6OmNvdXQgPDwgbXlGdW5jdGlvbi5ldmFsKDYpIDw8IHN0ZDo6ZW5kbDsKfQo=