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

char *name = "NMSE problem 3.4.1";

double f_if(float x) {
        float r4617719 = 1.0f;
        float r4617720 = x;
        float r4617721 = cos(r4617720);
        float r4617722 = r4617719 - r4617721;
        float r4617723 = r4617720 * r4617720;
        float r4617724 = r4617722 / r4617723;
        return r4617724;
}

double f_id(double x) {
        double r4617725 = 1.0;
        double r4617726 = x;
        double r4617727 = cos(r4617726);
        double r4617728 = r4617725 - r4617727;
        double r4617729 = r4617726 * r4617726;
        double r4617730 = r4617728 / r4617729;
        return r4617730;
}


double f_of(float x) {
        float r4617731 = x;
        float r4617732 = sin(r4617731);
        float r4617733 = r4617732 / r4617731;
        float r4617734 = 1.0f;
        float r4617735 = cos(r4617731);
        float r4617736 = r4617734 + r4617735;
        float r4617737 = r4617732 / r4617736;
        float r4617738 = r4617737 / r4617731;
        float r4617739 = r4617733 * r4617738;
        return r4617739;
}

double f_od(double x) {
        double r4617740 = x;
        double r4617741 = sin(r4617740);
        double r4617742 = r4617741 / r4617740;
        double r4617743 = 1.0;
        double r4617744 = cos(r4617740);
        double r4617745 = r4617743 + r4617744;
        double r4617746 = r4617741 / r4617745;
        double r4617747 = r4617746 / r4617740;
        double r4617748 = r4617742 * r4617747;
        return r4617748;
}

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 r4617749, r4617750, r4617751, r4617752, r4617753, r4617754;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init_set_str(r4617749, "1", 10, MPFR_RNDN);
        mpfr_init(r4617750);
        mpfr_init(r4617751);
        mpfr_init(r4617752);
        mpfr_init(r4617753);
        mpfr_init(r4617754);
}

double f_im(double x) {
        ;
        mpfr_set_d(r4617750, x, MPFR_RNDN);
        mpfr_cos(r4617751, r4617750, MPFR_RNDN);
        mpfr_sub(r4617752, r4617749, r4617751, MPFR_RNDN);
        mpfr_sqr(r4617753, r4617750, MPFR_RNDN);
        mpfr_div(r4617754, r4617752, r4617753, MPFR_RNDN);
        return mpfr_get_d(r4617754, MPFR_RNDN);
}

static mpfr_t r4617755, r4617756, r4617757, r4617758, r4617759, r4617760, r4617761, r4617762, r4617763;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r4617755);
        mpfr_init(r4617756);
        mpfr_init(r4617757);
        mpfr_init_set_str(r4617758, "1", 10, MPFR_RNDN);
        mpfr_init(r4617759);
        mpfr_init(r4617760);
        mpfr_init(r4617761);
        mpfr_init(r4617762);
        mpfr_init(r4617763);
}

double f_fm(double x) {
        mpfr_set_d(r4617755, x, MPFR_RNDN);
        mpfr_sin(r4617756, r4617755, MPFR_RNDN);
        mpfr_div(r4617757, r4617756, r4617755, MPFR_RNDN);
        ;
        mpfr_cos(r4617759, r4617755, MPFR_RNDN);
        mpfr_add(r4617760, r4617758, r4617759, MPFR_RNDN);
        mpfr_div(r4617761, r4617756, r4617760, MPFR_RNDN);
        mpfr_div(r4617762, r4617761, r4617755, MPFR_RNDN);
        mpfr_mul(r4617763, r4617757, r4617762, MPFR_RNDN);
        return mpfr_get_d(r4617763, MPFR_RNDN);
}

static mpfr_t r4617764, r4617765, r4617766, r4617767, r4617768, r4617769, r4617770, r4617771, r4617772;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r4617764);
        mpfr_init(r4617765);
        mpfr_init(r4617766);
        mpfr_init_set_str(r4617767, "1", 10, MPFR_RNDN);
        mpfr_init(r4617768);
        mpfr_init(r4617769);
        mpfr_init(r4617770);
        mpfr_init(r4617771);
        mpfr_init(r4617772);
}

double f_dm(double x) {
        mpfr_set_d(r4617764, x, MPFR_RNDN);
        mpfr_sin(r4617765, r4617764, MPFR_RNDN);
        mpfr_div(r4617766, r4617765, r4617764, MPFR_RNDN);
        ;
        mpfr_cos(r4617768, r4617764, MPFR_RNDN);
        mpfr_add(r4617769, r4617767, r4617768, MPFR_RNDN);
        mpfr_div(r4617770, r4617765, r4617769, MPFR_RNDN);
        mpfr_div(r4617771, r4617770, r4617764, MPFR_RNDN);
        mpfr_mul(r4617772, r4617766, r4617771, MPFR_RNDN);
        return mpfr_get_d(r4617772, MPFR_RNDN);
}

