#include <iostream>
#include <math.h>
double exp_func(double x, double error) {
double prev_summ = 0;
double summ = 0;
double curr_x = 1;
double curr_fact = 1;
int k = 1;
while (1) {
prev_summ = summ;
summ += curr_x/curr_fact;
if (abs(summ - prev_summ) < error) return summ;
curr_x *= x;
curr_fact *= k;
k++;
}
}
double sin_func(double x, double error) {
double prev_summ = 0;
double summ = 0;
double curr_x = x;
double curr_fact = 1;
int k = 1;
while (1) {
prev_summ = summ;
summ += curr_x / curr_fact;
if (abs(summ - prev_summ) < error) return summ;
curr_x *= -1*x*x;
curr_fact *= (2*k)*(2*k+1);
k++;
}
}
double sqrt_func(double a, double error) {
double prev_x = 0;
double x = 2;
while (1) {
prev_x = x;
x = (1 / 2.) * (x + a / x);
if (abs(x - prev_x) < error) return x;
}
}
double func(double x) {
return sqrt(1 + x) * exp(x + 0.5) * sin(0.3 * x + 0.7);
}
int main() {
std::cout << "x my_func std_func error" << std::endl;
float c1 = 7.5;
float c2 = 3.3;
float c3 = 12.3;
double epsilon1 = pow(10, -6) / c1;
double epsilon2 = pow(10, -6) / c2;
double epsilon3 = pow(10, -6) / c3;
float x = 0.5;
for (int i = 0; i < 11; i++) {
double my_func = sqrt_func(1 + x, epsilon1) * exp_func(x + 0.5, epsilon2) * sin_func(0.3 * x + 0.7, epsilon3);
double std_func = func(x);
printf("%.2f ", x);
printf("%.20f ", my_func);
printf("%.20f ", std_func);
printf("%.20f\n", abs(my_func - std_func));
x += 0.01;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgoKZG91YmxlIGV4cF9mdW5jKGRvdWJsZSB4LCBkb3VibGUgZXJyb3IpIHsKCWRvdWJsZSBwcmV2X3N1bW0gPSAwOwoJZG91YmxlIHN1bW0gPSAwOwoJZG91YmxlIGN1cnJfeCA9IDE7Cglkb3VibGUgY3Vycl9mYWN0ID0gMTsKCglpbnQgayA9IDE7Cgl3aGlsZSAoMSkgewoJCXByZXZfc3VtbSA9IHN1bW07CgkJc3VtbSArPSBjdXJyX3gvY3Vycl9mYWN0OwoKCQlpZiAoYWJzKHN1bW0gLSBwcmV2X3N1bW0pIDwgZXJyb3IpIHJldHVybiBzdW1tOwoKCQljdXJyX3ggKj0geDsKCQljdXJyX2ZhY3QgKj0gazsKCgkJaysrOwoJfQp9CgkKZG91YmxlIHNpbl9mdW5jKGRvdWJsZSB4LCBkb3VibGUgZXJyb3IpIHsKCWRvdWJsZSBwcmV2X3N1bW0gPSAwOwoJZG91YmxlIHN1bW0gPSAwOwoJZG91YmxlIGN1cnJfeCA9IHg7Cglkb3VibGUgY3Vycl9mYWN0ID0gMTsKCglpbnQgayA9IDE7Cgl3aGlsZSAoMSkgewoJCXByZXZfc3VtbSA9IHN1bW07CgkJc3VtbSArPSBjdXJyX3ggLyBjdXJyX2ZhY3Q7CgkJCgkJaWYgKGFicyhzdW1tIC0gcHJldl9zdW1tKSA8IGVycm9yKSByZXR1cm4gc3VtbTsKCgkJY3Vycl94ICo9IC0xKngqeDsKCQljdXJyX2ZhY3QgKj0gKDIqaykqKDIqaysxKTsKCgkJaysrOwoJfQp9Cgpkb3VibGUgc3FydF9mdW5jKGRvdWJsZSBhLCBkb3VibGUgZXJyb3IpIHsKCWRvdWJsZSBwcmV2X3ggPSAwOwoJZG91YmxlIHggPSAyOwoKCXdoaWxlICgxKSB7CgkJcHJldl94ID0geDsKCQl4ID0gKDEgLyAyLikgKiAoeCArIGEgLyB4KTsKCgkJaWYgKGFicyh4IC0gcHJldl94KSA8IGVycm9yKSByZXR1cm4geDsKCX0KfQoKZG91YmxlIGZ1bmMoZG91YmxlIHgpIHsKCXJldHVybiBzcXJ0KDEgKyB4KSAqIGV4cCh4ICsgMC41KSAqIHNpbigwLjMgKiB4ICsgMC43KTsKfQoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQgPDwgInggICAgICAgbXlfZnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZF9mdW5jICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciIgPDwgc3RkOjplbmRsOwoKCWZsb2F0IGMxID0gNy41OwoJZmxvYXQgYzIgPSAzLjM7CglmbG9hdCBjMyA9IDEyLjM7CgoJZG91YmxlIGVwc2lsb24xID0gcG93KDEwLCAtNikgLyBjMTsKCWRvdWJsZSBlcHNpbG9uMiA9IHBvdygxMCwgLTYpIC8gYzI7Cglkb3VibGUgZXBzaWxvbjMgPSBwb3coMTAsIC02KSAvIGMzOwoKCWZsb2F0IHggPSAwLjU7Cglmb3IgKGludCBpID0gMDsgaSA8IDExOyBpKyspIHsKCQlkb3VibGUgbXlfZnVuYyA9IHNxcnRfZnVuYygxICsgeCwgZXBzaWxvbjEpICogZXhwX2Z1bmMoeCArIDAuNSwgZXBzaWxvbjIpICogc2luX2Z1bmMoMC4zICogeCArIDAuNywgZXBzaWxvbjMpOwoJCWRvdWJsZSBzdGRfZnVuYyA9IGZ1bmMoeCk7CgkJcHJpbnRmKCIlLjJmICAgICIsIHgpOwoJCXByaW50ZigiJS4yMGYgICAgICAgICAgICAiLCBteV9mdW5jKTsKCQlwcmludGYoIiUuMjBmICAgICAgICAgICAgIiwgc3RkX2Z1bmMpOwoJCXByaW50ZigiJS4yMGZcbiIsIGFicyhteV9mdW5jIC0gc3RkX2Z1bmMpKTsKCQkKCQl4ICs9IDAuMDE7Cgl9Cn0=