#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define F(t) (5 + 2*(t) + 0.6*(t)*exp(-0.3*(t)*(t)))
double binsearch(const double t0, const double r, const double dec) {
const double eps
= pow(10, -dec
);
double a = t0 - r;
double b = t0 + r;
double c = t0;
do {
double F_a = F(a);
double F_b = F(b);
double F_c = F(c);
return c;
}
if (signbit(F_a) ^ signbit(F_c)) {
b = c;
} else if (signbit(F_c) ^ signbit(F_b)) {
a = c;
} else {
return NAN;
}
c = (a + b) / 2;
} while (1);
}
main() {
printf("found: %1.10f\n", binsearch
(-2.5, 0.5, 10)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCiNkZWZpbmUgRih0KSAoNSArIDIqKHQpICsgMC42Kih0KSpleHAoLTAuMyoodCkqKHQpKSkKCmRvdWJsZSBiaW5zZWFyY2goY29uc3QgZG91YmxlIHQwLCBjb25zdCBkb3VibGUgciwgY29uc3QgZG91YmxlIGRlYykgewogIGNvbnN0IGRvdWJsZSBlcHMgPSBwb3coMTAsIC1kZWMpOwogIAogIGRvdWJsZSBhID0gdDAgLSByOwogIGRvdWJsZSBiID0gdDAgKyByOwogIGRvdWJsZSBjID0gdDA7CiAgCiAgZG8gewogICAgZG91YmxlIEZfYSA9IEYoYSk7CiAgICBkb3VibGUgRl9iID0gRihiKTsKICAgIGRvdWJsZSBGX2MgPSBGKGMpOwogIAkKICAJaWYgKGZhYnMoRl9jKSA8IGVwcykgewogIAkgIHJldHVybiBjOwogIAl9CiAgCQogICAgaWYgKHNpZ25iaXQoRl9hKSBeIHNpZ25iaXQoRl9jKSkgewogICAgICBiID0gYzsKICAgIH0gZWxzZSBpZiAoc2lnbmJpdChGX2MpIF4gc2lnbmJpdChGX2IpKSB7CiAgICAgIGEgPSBjOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIE5BTjsKICAgIH0KIAogICAgYyA9IChhICsgYikgLyAyOwogIH0gd2hpbGUgKDEpOwp9CgptYWluKCkgewogIHByaW50ZigiZm91bmQ6ICUxLjEwZlxuIiwgYmluc2VhcmNoKC0yLjUsIDAuNSwgMTApKTsKICByZXR1cm4gMDsKfQ==