#include <cmath>
#include <iostream>
using namespace std;
double functionA(double x) {
return sin(2.0 * x) - 1.0 + x;
}
double functionB(double x) {
return 2.0 * x / (1.0 + x / 1.5);
}
double bisectionMethod(double (*function)(double), double a, double b, double tolerance) {
double x;
double f;
double error = tolerance + 1;
int step = 0;
double fa = (*function)(a);
double fb = (*function)(b);
//Check the conditions of a root in the given interval
if (a < b) {
if (fa * fb < 0) {
while (error > tolerance) {
step++;
x = (a + b) / 2.0;
f = (*function)(x);
if (f == 0) {
cout << "Root found in x = " << x;
return x;
} else if (f * fa > 0) {
a = x;
} else if (f * fa < 0) {
b = x;
}
error = (b - a) / pow(2.0, (double) step + 1);
}
cout << "Root found in x = " << x;
return x;
} else {
cout << "There not exist a root in that interval." << endl;
return -1;
}
} else {
cout << "Mandatory \"a < b\", verify." << endl;
return -1;
}
}
int main(int argc, char *argv[]){
bisectionMethod(functionA, -3.0, 3.0, 10.0e-7);
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZG91YmxlIGZ1bmN0aW9uQShkb3VibGUgeCkgewogICAgcmV0dXJuIHNpbigyLjAgKiB4KSAtIDEuMCArIHg7Cn0KCmRvdWJsZSBmdW5jdGlvbkIoZG91YmxlIHgpIHsKICAgIHJldHVybiAyLjAgKiB4IC8gKDEuMCArIHggLyAxLjUpOwp9Cgpkb3VibGUgYmlzZWN0aW9uTWV0aG9kKGRvdWJsZSAoKmZ1bmN0aW9uKShkb3VibGUpLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSB0b2xlcmFuY2UpIHsKICAgIGRvdWJsZSB4OwogICAgZG91YmxlIGY7CiAgICBkb3VibGUgZXJyb3IgPSB0b2xlcmFuY2UgKyAxOwogICAgaW50IHN0ZXAgPSAwOwogICAgZG91YmxlIGZhID0gKCpmdW5jdGlvbikoYSk7CiAgICBkb3VibGUgZmIgPSAoKmZ1bmN0aW9uKShiKTsKICAgIC8vQ2hlY2sgdGhlIGNvbmRpdGlvbnMgb2YgYSByb290IGluIHRoZSBnaXZlbiBpbnRlcnZhbAogICAgaWYgKGEgPCBiKSB7CiAgICAgICAgaWYgKGZhICogZmIgPCAwKSB7CiAgICAgICAgICAgIHdoaWxlIChlcnJvciA+IHRvbGVyYW5jZSkgewogICAgICAgICAgICAgICAgc3RlcCsrOwoKICAgICAgICAgICAgICAgIHggPSAoYSArIGIpIC8gMi4wOwogICAgICAgICAgICAgICAgZiA9ICgqZnVuY3Rpb24pKHgpOwoKICAgICAgICAgICAgICAgIGlmIChmID09IDApIHsKICAgICAgICAgICAgICAgICAgICBjb3V0IDw8ICJSb290IGZvdW5kIGluIHggPSAiIDw8IHg7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGYgKiBmYSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBhID0geDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZiAqIGZhIDwgMCkgewogICAgICAgICAgICAgICAgICAgIGIgPSB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3IgPSAoYiAtIGEpIC8gcG93KDIuMCwgKGRvdWJsZSkgc3RlcCArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvdXQgPDwgIlJvb3QgZm91bmQgaW4geCA9ICIgPDwgeDsKICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY291dCA8PCAiVGhlcmUgbm90IGV4aXN0IGEgcm9vdCBpbiB0aGF0IGludGVydmFsLiIgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY291dCA8PCAiTWFuZGF0b3J5IFwiYSA8IGJcIiwgdmVyaWZ5LiIgPDwgZW5kbDsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pewogICAgYmlzZWN0aW9uTWV0aG9kKGZ1bmN0aW9uQSwgLTMuMCwgMy4wLCAxMC4wZS03KTsKfQ==