#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 r5352787 = 1.0f;
        float r5352788 = x;
        float r5352789 = cos(r5352788);
        float r5352790 = r5352787 - r5352789;
        float r5352791 = r5352788 * r5352788;
        float r5352792 = r5352790 / r5352791;
        return r5352792;
}

double f_id(double x) {
        double r5352793 = 1.0;
        double r5352794 = x;
        double r5352795 = cos(r5352794);
        double r5352796 = r5352793 - r5352795;
        double r5352797 = r5352794 * r5352794;
        double r5352798 = r5352796 / r5352797;
        return r5352798;
}


double f_of(float x) {
        float r5352799 = x;
        float r5352800 = sin(r5352799);
        float r5352801 = r5352800 / r5352799;
        float r5352802 = 1.0f;
        float r5352803 = cos(r5352799);
        float r5352804 = r5352802 + r5352803;
        float r5352805 = r5352800 / r5352804;
        float r5352806 = r5352805 / r5352799;
        float r5352807 = r5352801 * r5352806;
        return r5352807;
}

double f_od(double x) {
        double r5352808 = x;
        double r5352809 = sin(r5352808);
        double r5352810 = r5352809 / r5352808;
        double r5352811 = 1.0;
        double r5352812 = cos(r5352808);
        double r5352813 = r5352811 + r5352812;
        double r5352814 = r5352809 / r5352813;
        double r5352815 = r5352814 / r5352808;
        double r5352816 = r5352810 * r5352815;
        return r5352816;
}

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 r5352817, r5352818, r5352819, r5352820, r5352821, r5352822;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init_set_str(r5352817, "1", 10, MPFR_RNDN);
        mpfr_init(r5352818);
        mpfr_init(r5352819);
        mpfr_init(r5352820);
        mpfr_init(r5352821);
        mpfr_init(r5352822);
}

double f_im(double x) {
        ;
        mpfr_set_d(r5352818, x, MPFR_RNDN);
        mpfr_cos(r5352819, r5352818, MPFR_RNDN);
        mpfr_sub(r5352820, r5352817, r5352819, MPFR_RNDN);
        mpfr_sqr(r5352821, r5352818, MPFR_RNDN);
        mpfr_div(r5352822, r5352820, r5352821, MPFR_RNDN);
        return mpfr_get_d(r5352822, MPFR_RNDN);
}

static mpfr_t r5352823, r5352824, r5352825, r5352826, r5352827, r5352828, r5352829, r5352830, r5352831;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r5352823);
        mpfr_init(r5352824);
        mpfr_init(r5352825);
        mpfr_init_set_str(r5352826, "1", 10, MPFR_RNDN);
        mpfr_init(r5352827);
        mpfr_init(r5352828);
        mpfr_init(r5352829);
        mpfr_init(r5352830);
        mpfr_init(r5352831);
}

double f_fm(double x) {
        mpfr_set_d(r5352823, x, MPFR_RNDN);
        mpfr_sin(r5352824, r5352823, MPFR_RNDN);
        mpfr_div(r5352825, r5352824, r5352823, MPFR_RNDN);
        ;
        mpfr_cos(r5352827, r5352823, MPFR_RNDN);
        mpfr_add(r5352828, r5352826, r5352827, MPFR_RNDN);
        mpfr_div(r5352829, r5352824, r5352828, MPFR_RNDN);
        mpfr_div(r5352830, r5352829, r5352823, MPFR_RNDN);
        mpfr_mul(r5352831, r5352825, r5352830, MPFR_RNDN);
        return mpfr_get_d(r5352831, MPFR_RNDN);
}

static mpfr_t r5352832, r5352833, r5352834, r5352835, r5352836, r5352837, r5352838, r5352839, r5352840;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r5352832);
        mpfr_init(r5352833);
        mpfr_init(r5352834);
        mpfr_init_set_str(r5352835, "1", 10, MPFR_RNDN);
        mpfr_init(r5352836);
        mpfr_init(r5352837);
        mpfr_init(r5352838);
        mpfr_init(r5352839);
        mpfr_init(r5352840);
}

double f_dm(double x) {
        mpfr_set_d(r5352832, x, MPFR_RNDN);
        mpfr_sin(r5352833, r5352832, MPFR_RNDN);
        mpfr_div(r5352834, r5352833, r5352832, MPFR_RNDN);
        ;
        mpfr_cos(r5352836, r5352832, MPFR_RNDN);
        mpfr_add(r5352837, r5352835, r5352836, MPFR_RNDN);
        mpfr_div(r5352838, r5352833, r5352837, MPFR_RNDN);
        mpfr_div(r5352839, r5352838, r5352832, MPFR_RNDN);
        mpfr_mul(r5352840, r5352834, r5352839, MPFR_RNDN);
        return mpfr_get_d(r5352840, MPFR_RNDN);
}

