#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "cos2 (problem 3.4.1)";

double f_if(float x) {
        float r8506 = 1;
        float r8507 = x;
        float r8508 = cos(r8507);
        float r8509 = r8506 - r8508;
        float r8510 = r8507 * r8507;
        float r8511 = r8509 / r8510;
        return r8511;
}

double f_id(double x) {
        double r8512 = 1;
        double r8513 = x;
        double r8514 = cos(r8513);
        double r8515 = r8512 - r8514;
        double r8516 = r8513 * r8513;
        double r8517 = r8515 / r8516;
        return r8517;
}


double f_of(float x) {
        float r8518 = x;
        float r8519 = -0.033966867866531136;
        bool r8520 = r8518 <= r8519;
        float r8521 = 0.029704376882507127;
        bool r8522 = r8518 <= r8521;
        float r8523 = !r8522;
        bool r8524 = r8520 || r8523;
        float r8525 = 1;
        float r8526 = r8525 / r8518;
        float r8527 = cos(r8518);
        float r8528 = r8525 - r8527;
        float r8529 = r8528 / r8518;
        float r8530 = r8526 * r8529;
        float r8531 = 1/720;
        float r8532 = 4;
        float r8533 = pow(r8518, r8532);
        float r8534 = 1/2;
        float r8535 = fma(r8531, r8533, r8534);
        float r8536 = 1/24;
        float r8537 = r8518 * r8536;
        float r8538 = r8518 * r8537;
        float r8539 = r8535 - r8538;
        float r8540 = r8524 ? r8530 : r8539;
        return r8540;
}

double f_od(double x) {
        double r8541 = x;
        double r8542 = -0.033966867866531136;
        bool r8543 = r8541 <= r8542;
        double r8544 = 0.029704376882507127;
        bool r8545 = r8541 <= r8544;
        double r8546 = !r8545;
        bool r8547 = r8543 || r8546;
        double r8548 = 1;
        double r8549 = r8548 / r8541;
        double r8550 = cos(r8541);
        double r8551 = r8548 - r8550;
        double r8552 = r8551 / r8541;
        double r8553 = r8549 * r8552;
        double r8554 = 1/720;
        double r8555 = 4;
        double r8556 = pow(r8541, r8555);
        double r8557 = 1/2;
        double r8558 = fma(r8554, r8556, r8557);
        double r8559 = 1/24;
        double r8560 = r8541 * r8559;
        double r8561 = r8541 * r8560;
        double r8562 = r8558 - r8561;
        double r8563 = r8547 ? r8553 : r8562;
        return r8563;
}

void mpfr_fmod2(mpfr_t r, mpfr_t n, mpfr_t d, mpfr_rnd_t rmd) {
        mpfr_fmod(r, n, d, rmd);
        if (mpfr_cmp_ui(r, 0) < 0) mpfr_add(r, r, d, rmd);
}


static mpfr_t r8564, r8565, r8566, r8567, r8568, r8569;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2384);
        mpfr_init_set_str(r8564, "1", 10, MPFR_RNDN);
        mpfr_init(r8565);
        mpfr_init(r8566);
        mpfr_init(r8567);
        mpfr_init(r8568);
        mpfr_init(r8569);
}

double f_im(double x) {
        ;
        mpfr_set_d(r8565, x, MPFR_RNDN);
        mpfr_cos(r8566, r8565, MPFR_RNDN);
        mpfr_sub(r8567, r8564, r8566, MPFR_RNDN);
        mpfr_mul(r8568, r8565, r8565, MPFR_RNDN);
        mpfr_div(r8569, r8567, r8568, MPFR_RNDN);
        return mpfr_get_d(r8569, MPFR_RNDN);
}

static mpfr_t r8570, r8571, r8572, r8573, r8574, r8575, r8576, r8577, r8578, r8579, r8580, r8581, r8582, r8583, r8584, r8585, r8586, r8587, r8588, r8589, r8590, r8591, r8592;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8570);
        mpfr_init_set_str(r8571, "-0.033966867866531136", 10, MPFR_RNDN);
        mpfr_init(r8572);
        mpfr_init_set_str(r8573, "0.029704376882507127", 10, MPFR_RNDN);
        mpfr_init(r8574);
        mpfr_init(r8575);
        mpfr_init(r8576);
        mpfr_init_set_str(r8577, "1", 10, MPFR_RNDN);
        mpfr_init(r8578);
        mpfr_init(r8579);
        mpfr_init(r8580);
        mpfr_init(r8581);
        mpfr_init(r8582);
        mpfr_init_set_str(r8583, "1/720", 10, MPFR_RNDN);
        mpfr_init_set_str(r8584, "4", 10, MPFR_RNDN);
        mpfr_init(r8585);
        mpfr_init_set_str(r8586, "1/2", 10, MPFR_RNDN);
        mpfr_init(r8587);
        mpfr_init_set_str(r8588, "1/24", 10, MPFR_RNDN);
        mpfr_init(r8589);
        mpfr_init(r8590);
        mpfr_init(r8591);
        mpfr_init(r8592);
}

double f_fm(double x) {
        mpfr_set_d(r8570, x, MPFR_RNDN);
        ;
        mpfr_set_si(r8572, mpfr_cmp(r8570, r8571) <= 0, MPFR_RNDN);
        ;
        mpfr_set_si(r8574, mpfr_cmp(r8570, r8573) <= 0, MPFR_RNDN);
        mpfr_set_si(r8575, !mpfr_get_si(r8574, MPFR_RNDN), MPFR_RNDN);
        mpfr_set_si(r8576, mpfr_get_si(r8572, MPFR_RNDN) || mpfr_get_si(r8575, MPFR_RNDN), MPFR_RNDN);
        ;
        mpfr_div(r8578, r8577, r8570, MPFR_RNDN);
        mpfr_cos(r8579, r8570, MPFR_RNDN);
        mpfr_sub(r8580, r8577, r8579, MPFR_RNDN);
        mpfr_div(r8581, r8580, r8570, MPFR_RNDN);
        mpfr_mul(r8582, r8578, r8581, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r8585, r8570, r8584, MPFR_RNDN);
        ;
        mpfr_fma(r8587, r8583, r8585, r8586, MPFR_RNDN);
        ;
        mpfr_mul(r8589, r8570, r8588, MPFR_RNDN);
        mpfr_mul(r8590, r8570, r8589, MPFR_RNDN);
        mpfr_sub(r8591, r8587, r8590, MPFR_RNDN);
        if (mpfr_get_si(r8576, MPFR_RNDN)) { mpfr_set(r8592, r8582, MPFR_RNDN); } else { mpfr_set(r8592, r8591, MPFR_RNDN); };
        return mpfr_get_d(r8592, MPFR_RNDN);
}

static mpfr_t r8593, r8594, r8595, r8596, r8597, r8598, r8599, r8600, r8601, r8602, r8603, r8604, r8605, r8606, r8607, r8608, r8609, r8610, r8611, r8612, r8613, r8614, r8615;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8593);
        mpfr_init_set_str(r8594, "-0.033966867866531136", 10, MPFR_RNDN);
        mpfr_init(r8595);
        mpfr_init_set_str(r8596, "0.029704376882507127", 10, MPFR_RNDN);
        mpfr_init(r8597);
        mpfr_init(r8598);
        mpfr_init(r8599);
        mpfr_init_set_str(r8600, "1", 10, MPFR_RNDN);
        mpfr_init(r8601);
        mpfr_init(r8602);
        mpfr_init(r8603);
        mpfr_init(r8604);
        mpfr_init(r8605);
        mpfr_init_set_str(r8606, "1/720", 10, MPFR_RNDN);
        mpfr_init_set_str(r8607, "4", 10, MPFR_RNDN);
        mpfr_init(r8608);
        mpfr_init_set_str(r8609, "1/2", 10, MPFR_RNDN);
        mpfr_init(r8610);
        mpfr_init_set_str(r8611, "1/24", 10, MPFR_RNDN);
        mpfr_init(r8612);
        mpfr_init(r8613);
        mpfr_init(r8614);
        mpfr_init(r8615);
}

double f_dm(double x) {
        mpfr_set_d(r8593, x, MPFR_RNDN);
        ;
        mpfr_set_si(r8595, mpfr_cmp(r8593, r8594) <= 0, MPFR_RNDN);
        ;
        mpfr_set_si(r8597, mpfr_cmp(r8593, r8596) <= 0, MPFR_RNDN);
        mpfr_set_si(r8598, !mpfr_get_si(r8597, MPFR_RNDN), MPFR_RNDN);
        mpfr_set_si(r8599, mpfr_get_si(r8595, MPFR_RNDN) || mpfr_get_si(r8598, MPFR_RNDN), MPFR_RNDN);
        ;
        mpfr_div(r8601, r8600, r8593, MPFR_RNDN);
        mpfr_cos(r8602, r8593, MPFR_RNDN);
        mpfr_sub(r8603, r8600, r8602, MPFR_RNDN);
        mpfr_div(r8604, r8603, r8593, MPFR_RNDN);
        mpfr_mul(r8605, r8601, r8604, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r8608, r8593, r8607, MPFR_RNDN);
        ;
        mpfr_fma(r8610, r8606, r8608, r8609, MPFR_RNDN);
        ;
        mpfr_mul(r8612, r8593, r8611, MPFR_RNDN);
        mpfr_mul(r8613, r8593, r8612, MPFR_RNDN);
        mpfr_sub(r8614, r8610, r8613, MPFR_RNDN);
        if (mpfr_get_si(r8599, MPFR_RNDN)) { mpfr_set(r8615, r8605, MPFR_RNDN); } else { mpfr_set(r8615, r8614, MPFR_RNDN); };
        return mpfr_get_d(r8615, MPFR_RNDN);
}

