#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 r4939475 = 1.0f;
        float r4939476 = x;
        float r4939477 = cos(r4939476);
        float r4939478 = r4939475 - r4939477;
        float r4939479 = r4939476 * r4939476;
        float r4939480 = r4939478 / r4939479;
        return r4939480;
}

double f_id(double x) {
        double r4939481 = 1.0;
        double r4939482 = x;
        double r4939483 = cos(r4939482);
        double r4939484 = r4939481 - r4939483;
        double r4939485 = r4939482 * r4939482;
        double r4939486 = r4939484 / r4939485;
        return r4939486;
}


double f_of(float x) {
        float r4939487 = x;
        float r4939488 = sin(r4939487);
        float r4939489 = r4939488 / r4939487;
        float r4939490 = 1.0f;
        float r4939491 = cos(r4939487);
        float r4939492 = r4939490 + r4939491;
        float r4939493 = r4939488 / r4939492;
        float r4939494 = r4939493 / r4939487;
        float r4939495 = r4939489 * r4939494;
        return r4939495;
}

double f_od(double x) {
        double r4939496 = x;
        double r4939497 = sin(r4939496);
        double r4939498 = r4939497 / r4939496;
        double r4939499 = 1.0;
        double r4939500 = cos(r4939496);
        double r4939501 = r4939499 + r4939500;
        double r4939502 = r4939497 / r4939501;
        double r4939503 = r4939502 / r4939496;
        double r4939504 = r4939498 * r4939503;
        return r4939504;
}

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 r4939505, r4939506, r4939507, r4939508, r4939509, r4939510;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init_set_str(r4939505, "1", 10, MPFR_RNDN);
        mpfr_init(r4939506);
        mpfr_init(r4939507);
        mpfr_init(r4939508);
        mpfr_init(r4939509);
        mpfr_init(r4939510);
}

double f_im(double x) {
        ;
        mpfr_set_d(r4939506, x, MPFR_RNDN);
        mpfr_cos(r4939507, r4939506, MPFR_RNDN);
        mpfr_sub(r4939508, r4939505, r4939507, MPFR_RNDN);
        mpfr_sqr(r4939509, r4939506, MPFR_RNDN);
        mpfr_div(r4939510, r4939508, r4939509, MPFR_RNDN);
        return mpfr_get_d(r4939510, MPFR_RNDN);
}

static mpfr_t r4939511, r4939512, r4939513, r4939514, r4939515, r4939516, r4939517, r4939518, r4939519;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r4939511);
        mpfr_init(r4939512);
        mpfr_init(r4939513);
        mpfr_init_set_str(r4939514, "1", 10, MPFR_RNDN);
        mpfr_init(r4939515);
        mpfr_init(r4939516);
        mpfr_init(r4939517);
        mpfr_init(r4939518);
        mpfr_init(r4939519);
}

double f_fm(double x) {
        mpfr_set_d(r4939511, x, MPFR_RNDN);
        mpfr_sin(r4939512, r4939511, MPFR_RNDN);
        mpfr_div(r4939513, r4939512, r4939511, MPFR_RNDN);
        ;
        mpfr_cos(r4939515, r4939511, MPFR_RNDN);
        mpfr_add(r4939516, r4939514, r4939515, MPFR_RNDN);
        mpfr_div(r4939517, r4939512, r4939516, MPFR_RNDN);
        mpfr_div(r4939518, r4939517, r4939511, MPFR_RNDN);
        mpfr_mul(r4939519, r4939513, r4939518, MPFR_RNDN);
        return mpfr_get_d(r4939519, MPFR_RNDN);
}

static mpfr_t r4939520, r4939521, r4939522, r4939523, r4939524, r4939525, r4939526, r4939527, r4939528;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r4939520);
        mpfr_init(r4939521);
        mpfr_init(r4939522);
        mpfr_init_set_str(r4939523, "1", 10, MPFR_RNDN);
        mpfr_init(r4939524);
        mpfr_init(r4939525);
        mpfr_init(r4939526);
        mpfr_init(r4939527);
        mpfr_init(r4939528);
}

double f_dm(double x) {
        mpfr_set_d(r4939520, x, MPFR_RNDN);
        mpfr_sin(r4939521, r4939520, MPFR_RNDN);
        mpfr_div(r4939522, r4939521, r4939520, MPFR_RNDN);
        ;
        mpfr_cos(r4939524, r4939520, MPFR_RNDN);
        mpfr_add(r4939525, r4939523, r4939524, MPFR_RNDN);
        mpfr_div(r4939526, r4939521, r4939525, MPFR_RNDN);
        mpfr_div(r4939527, r4939526, r4939520, MPFR_RNDN);
        mpfr_mul(r4939528, r4939522, r4939527, MPFR_RNDN);
        return mpfr_get_d(r4939528, MPFR_RNDN);
}

