#include <iostream>
#include <cmath>
#include <functional>
#include <iomanip>
using namespace std;
bool correct = false;
double solve(function<double (double)> f, double a, double b, double eps)
{
if (a > b) swap(a, b);
while(fabs(a - b) > eps && (correct = f(a)*f(b) < 0)) {
double x = (a + b) / 2.0;
if ( f(a) * f(x) < 0 )
b = x;
else a = x;
}
return (a + b) / 2.0;
}
int main()
{
/*auto f1 = [](double x)->double { return 2 * pow(x, 2.0) - pow(0.5, x) - 3; };*/
auto f1 = [](double x)->double { return x*x - 0.5; };
cout <<"[2;3] : "<<fixed << setprecision(11) << solve( f1, 2, 3, 0.001 );
if(correct)
cout<<" correct";
else
cout<<" incorrect";
cout <<"[0;1] : "<<fixed << setprecision(11) << solve( f1,0, 1, 0.001 );
if(correct)
cout<<" correct";
else
cout<<" incorrect";
cin.get();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8aW9tYW5pcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogYm9vbCBjb3JyZWN0ID0gZmFsc2U7CmRvdWJsZSBzb2x2ZShmdW5jdGlvbjxkb3VibGUgKGRvdWJsZSk+IGYsIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGVwcykKewogICAgaWYgKGEgPiBiKSBzd2FwKGEsIGIpOwogICAgd2hpbGUoZmFicyhhIC0gYikgPiBlcHMgJiYgKGNvcnJlY3QgPSBmKGEpKmYoYikgPCAwKSkgewogICAgICAgIGRvdWJsZSB4ID0gKGEgKyBiKSAvIDIuMDsKICAgICAgICBpZiAoIGYoYSkgKiBmKHgpIDwgMCApCiAgICAgICAgICAgIGIgPSB4OwogICAgICAgIGVsc2UgYSA9IHg7CiAgICB9CiAgICByZXR1cm4gKGEgKyBiKSAvIDIuMDsKfQogCmludCBtYWluKCkKewogICAgLyphdXRvIGYxID0gW10oZG91YmxlIHgpLT5kb3VibGUgeyByZXR1cm4gMiAqIHBvdyh4LCAyLjApIC0gcG93KDAuNSwgeCkgLSAzOyB9OyovCiAgICBhdXRvIGYxID0gW10oZG91YmxlIHgpLT5kb3VibGUgeyByZXR1cm4geCp4IC0gMC41OyB9OwogICAgY291dCA8PCJbMjszXSA6ICI8PGZpeGVkIDw8IHNldHByZWNpc2lvbigxMSkgPDwgc29sdmUoIGYxLCAyLCAzLCAwLjAwMSApOwogICAgaWYoY29ycmVjdCkKICAgIGNvdXQ8PCIgY29ycmVjdCI7CiAgICBlbHNlCiAgICBjb3V0PDwiIGluY29ycmVjdCI7CiAgICBjb3V0IDw8IlswOzFdIDogIjw8Zml4ZWQgPDwgc2V0cHJlY2lzaW9uKDExKSA8PCBzb2x2ZSggZjEsMCwgMSwgMC4wMDEgKTsKICAgIGlmKGNvcnJlY3QpCiAgICBjb3V0PDwiIGNvcnJlY3QiOwogICAgZWxzZQogICAgY291dDw8IiBpbmNvcnJlY3QiOwogICAgY2luLmdldCgpOwogICAgcmV0dXJuIDA7Cn0=