#include "./lib/worker.h" #include "lib/common.h" #include "math.h" const long double RUNGE_SIMPSON_CONST = 1.0L / 15; typedef long double (*func_value_t)(long double); typedef struct func_t { func_value_t value; func_value_t derivative; int id; } func_t; long double func_value(long double x) { return x * x * x * x * x * x - 15 * x * x * x * x * x + 134567 * x * x * x - 3486 * x * x + 100; } long double func_der(long double x) { return 6 * x * x * x * x * x - 75 * x * x * x * x + 403701 * x * x - 6972 * x; } long double func_value_x(long double x) { return x; } long double func_der_x(long double x) { x = x * 2; return 1; } func_t func = {func_value, func_der, 1}; // func_t func = {func_value_x, func_der_x, 1}; long double calculate_integral(func_t f, long double a, long double b, long double eps) { int n = 2; long double delta = (b - a) / n, x = 0; // integral value = (sum_by_1 + 2 * sum_by_2 + 4 * sum_by_4) * delta / 3 long double sum_by_1 = 0, sum_by_2 = 0, sum_by_4 = 0; sum_by_1 += f.value(a); sum_by_1 += f.value(b); x = a + delta; for (int i = 1; i < n; i += 2) { sum_by_4 += f.value(x); x += 2 * delta; } x = a + 2 * delta; for (int i = 2; i < n; i += 2) { sum_by_2 += f.value(x); x += 2 * delta; } long double prev_sum = (sum_by_1 + 2 * sum_by_2 + 4 * sum_by_4) * delta / 3; long double sum = prev_sum; do { prev_sum = sum; sum_by_2 += sum_by_4; sum_by_4 = 0; n *= 2; delta = (b - a) / n; x = a + delta; for (int i = 1; i < n; i += 2) { sum_by_4 += f.value(x); x += 2 * delta; } sum = (sum_by_1 + 2 * sum_by_2 + 4 * sum_by_4) * delta / 3; } while ((fabsl(prev_sum - sum) - eps / RUNGE_SIMPSON_CONST) > 0); return sum; } void worker_func(const char* task, size_t task_size, char** resp, size_t* resp_size) { long double* args = (long double*) task; task_size = task_size * 2; long double res = calculate_integral(func, args[0], args[1], args[2]); printf("task %Lf %Lf -> %Lf\n", args[0], args[1], res); *resp = calloc(1, sizeof(long double)); *((long double*) *resp) = res; *resp_size = sizeof(long double); } int32_t main() { worker_init("127.0.0.1", "33554", 1, worker_func); configure_timeout(10); worker_exec(); }