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

char *name = "NMSE problem 3.4.2";

double f_if(float a, float b, float eps) {
        float r5040587 = eps;
        float r5040588 = a;
        float r5040589 = b;
        float r5040590 = r5040588 + r5040589;
        float r5040591 = r5040590 * r5040587;
        float r5040592 = exp(r5040591);
        float r5040593 = 1.0f;
        float r5040594 = r5040592 - r5040593;
        float r5040595 = r5040587 * r5040594;
        float r5040596 = r5040588 * r5040587;
        float r5040597 = exp(r5040596);
        float r5040598 = r5040597 - r5040593;
        float r5040599 = r5040589 * r5040587;
        float r5040600 = exp(r5040599);
        float r5040601 = r5040600 - r5040593;
        float r5040602 = r5040598 * r5040601;
        float r5040603 = r5040595 / r5040602;
        return r5040603;
}

double f_id(double a, double b, double eps) {
        double r5040604 = eps;
        double r5040605 = a;
        double r5040606 = b;
        double r5040607 = r5040605 + r5040606;
        double r5040608 = r5040607 * r5040604;
        double r5040609 = exp(r5040608);
        double r5040610 = 1.0;
        double r5040611 = r5040609 - r5040610;
        double r5040612 = r5040604 * r5040611;
        double r5040613 = r5040605 * r5040604;
        double r5040614 = exp(r5040613);
        double r5040615 = r5040614 - r5040610;
        double r5040616 = r5040606 * r5040604;
        double r5040617 = exp(r5040616);
        double r5040618 = r5040617 - r5040610;
        double r5040619 = r5040615 * r5040618;
        double r5040620 = r5040612 / r5040619;
        return r5040620;
}


double f_of(float a, float b, float __attribute__((unused)) eps) {
        float r5040621 = 1.0f;
        float r5040622 = b;
        float r5040623 = r5040621 / r5040622;
        float r5040624 = a;
        float r5040625 = r5040621 / r5040624;
        float r5040626 = r5040623 + r5040625;
        return r5040626;
}

double f_od(double a, double b, double __attribute__((unused)) eps) {
        double r5040627 = 1.0;
        double r5040628 = b;
        double r5040629 = r5040627 / r5040628;
        double r5040630 = a;
        double r5040631 = r5040627 / r5040630;
        double r5040632 = r5040629 + r5040631;
        return r5040632;
}

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 r5040633, r5040634, r5040635, r5040636, r5040637, r5040638, r5040639, r5040640, r5040641, r5040642, r5040643, r5040644, r5040645, r5040646, r5040647, r5040648, r5040649;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r5040633);
        mpfr_init(r5040634);
        mpfr_init(r5040635);
        mpfr_init(r5040636);
        mpfr_init(r5040637);
        mpfr_init(r5040638);
        mpfr_init_set_str(r5040639, "1", 10, MPFR_RNDN);
        mpfr_init(r5040640);
        mpfr_init(r5040641);
        mpfr_init(r5040642);
        mpfr_init(r5040643);
        mpfr_init(r5040644);
        mpfr_init(r5040645);
        mpfr_init(r5040646);
        mpfr_init(r5040647);
        mpfr_init(r5040648);
        mpfr_init(r5040649);
}

double f_im(double a, double b, double eps) {
        mpfr_set_d(r5040633, eps, MPFR_RNDN);
        mpfr_set_d(r5040634, a, MPFR_RNDN);
        mpfr_set_d(r5040635, b, MPFR_RNDN);
        mpfr_add(r5040636, r5040634, r5040635, MPFR_RNDN);
        mpfr_mul(r5040637, r5040636, r5040633, MPFR_RNDN);
        mpfr_exp(r5040638, r5040637, MPFR_RNDN);
        ;
        mpfr_sub(r5040640, r5040638, r5040639, MPFR_RNDN);
        mpfr_mul(r5040641, r5040633, r5040640, MPFR_RNDN);
        mpfr_mul(r5040642, r5040634, r5040633, MPFR_RNDN);
        mpfr_exp(r5040643, r5040642, MPFR_RNDN);
        mpfr_sub(r5040644, r5040643, r5040639, MPFR_RNDN);
        mpfr_mul(r5040645, r5040635, r5040633, MPFR_RNDN);
        mpfr_exp(r5040646, r5040645, MPFR_RNDN);
        mpfr_sub(r5040647, r5040646, r5040639, MPFR_RNDN);
        mpfr_mul(r5040648, r5040644, r5040647, MPFR_RNDN);
        mpfr_div(r5040649, r5040641, r5040648, MPFR_RNDN);
        return mpfr_get_d(r5040649, MPFR_RNDN);
}

static mpfr_t r5040650, r5040651, r5040652, r5040653, r5040654, r5040655;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init_set_str(r5040650, "1", 10, MPFR_RNDN);
        mpfr_init(r5040651);
        mpfr_init(r5040652);
        mpfr_init(r5040653);
        mpfr_init(r5040654);
        mpfr_init(r5040655);
}

double f_fm(double a, double b, double __attribute__((unused)) eps) {
        ;
        mpfr_set_d(r5040651, b, MPFR_RNDN);
        mpfr_div(r5040652, r5040650, r5040651, MPFR_RNDN);
        mpfr_set_d(r5040653, a, MPFR_RNDN);
        mpfr_div(r5040654, r5040650, r5040653, MPFR_RNDN);
        mpfr_add(r5040655, r5040652, r5040654, MPFR_RNDN);
        return mpfr_get_d(r5040655, MPFR_RNDN);
}

static mpfr_t r5040656, r5040657, r5040658, r5040659, r5040660, r5040661;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init_set_str(r5040656, "1", 10, MPFR_RNDN);
        mpfr_init(r5040657);
        mpfr_init(r5040658);
        mpfr_init(r5040659);
        mpfr_init(r5040660);
        mpfr_init(r5040661);
}

double f_dm(double a, double b, double __attribute__((unused)) eps) {
        ;
        mpfr_set_d(r5040657, b, MPFR_RNDN);
        mpfr_div(r5040658, r5040656, r5040657, MPFR_RNDN);
        mpfr_set_d(r5040659, a, MPFR_RNDN);
        mpfr_div(r5040660, r5040656, r5040659, MPFR_RNDN);
        mpfr_add(r5040661, r5040658, r5040660, MPFR_RNDN);
        return mpfr_get_d(r5040661, MPFR_RNDN);
}

