#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 r5319615 = eps;
        float r5319616 = a;
        float r5319617 = b;
        float r5319618 = r5319616 + r5319617;
        float r5319619 = r5319618 * r5319615;
        float r5319620 = exp(r5319619);
        float r5319621 = 1.0f;
        float r5319622 = r5319620 - r5319621;
        float r5319623 = r5319615 * r5319622;
        float r5319624 = r5319616 * r5319615;
        float r5319625 = exp(r5319624);
        float r5319626 = r5319625 - r5319621;
        float r5319627 = r5319617 * r5319615;
        float r5319628 = exp(r5319627);
        float r5319629 = r5319628 - r5319621;
        float r5319630 = r5319626 * r5319629;
        float r5319631 = r5319623 / r5319630;
        return r5319631;
}

double f_id(double a, double b, double eps) {
        double r5319632 = eps;
        double r5319633 = a;
        double r5319634 = b;
        double r5319635 = r5319633 + r5319634;
        double r5319636 = r5319635 * r5319632;
        double r5319637 = exp(r5319636);
        double r5319638 = 1.0;
        double r5319639 = r5319637 - r5319638;
        double r5319640 = r5319632 * r5319639;
        double r5319641 = r5319633 * r5319632;
        double r5319642 = exp(r5319641);
        double r5319643 = r5319642 - r5319638;
        double r5319644 = r5319634 * r5319632;
        double r5319645 = exp(r5319644);
        double r5319646 = r5319645 - r5319638;
        double r5319647 = r5319643 * r5319646;
        double r5319648 = r5319640 / r5319647;
        return r5319648;
}


double f_of(float a, float b, float eps) {
        float r5319649 = b;
        float r5319650 = eps;
        float r5319651 = r5319649 * r5319650;
        float r5319652 = -7.556090982340352e+135f;
        bool r5319653 = r5319651 <= r5319652;
        float r5319654 = a;
        float r5319655 = r5319654 + r5319649;
        float r5319656 = r5319655 * r5319650;
        float r5319657 = exp(r5319656);
        float r5319658 = 1.0f;
        float r5319659 = r5319657 - r5319658;
        float r5319660 = r5319650 * r5319659;
        float r5319661 = r5319654 * r5319650;
        float r5319662 = exp(r5319661);
        float r5319663 = r5319662 - r5319658;
        float r5319664 = exp(r5319663);
        float r5319665 = log(r5319664);
        float r5319666 = exp(r5319651);
        float r5319667 = r5319666 - r5319658;
        float r5319668 = r5319665 * r5319667;
        float r5319669 = r5319660 / r5319668;
        float r5319670 = r5319658 / r5319649;
        float r5319671 = r5319658 / r5319654;
        float r5319672 = r5319670 + r5319671;
        float r5319673 = r5319653 ? r5319669 : r5319672;
        return r5319673;
}

double f_od(double a, double b, double eps) {
        double r5319674 = b;
        double r5319675 = eps;
        double r5319676 = r5319674 * r5319675;
        double r5319677 = -7.556090982340352e+135;
        bool r5319678 = r5319676 <= r5319677;
        double r5319679 = a;
        double r5319680 = r5319679 + r5319674;
        double r5319681 = r5319680 * r5319675;
        double r5319682 = exp(r5319681);
        double r5319683 = 1.0;
        double r5319684 = r5319682 - r5319683;
        double r5319685 = r5319675 * r5319684;
        double r5319686 = r5319679 * r5319675;
        double r5319687 = exp(r5319686);
        double r5319688 = r5319687 - r5319683;
        double r5319689 = exp(r5319688);
        double r5319690 = log(r5319689);
        double r5319691 = exp(r5319676);
        double r5319692 = r5319691 - r5319683;
        double r5319693 = r5319690 * r5319692;
        double r5319694 = r5319685 / r5319693;
        double r5319695 = r5319683 / r5319674;
        double r5319696 = r5319683 / r5319679;
        double r5319697 = r5319695 + r5319696;
        double r5319698 = r5319678 ? r5319694 : r5319697;
        return r5319698;
}

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 r5319699, r5319700, r5319701, r5319702, r5319703, r5319704, r5319705, r5319706, r5319707, r5319708, r5319709, r5319710, r5319711, r5319712, r5319713, r5319714, r5319715;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r5319699);
        mpfr_init(r5319700);
        mpfr_init(r5319701);
        mpfr_init(r5319702);
        mpfr_init(r5319703);
        mpfr_init(r5319704);
        mpfr_init_set_str(r5319705, "1", 10, MPFR_RNDN);
        mpfr_init(r5319706);
        mpfr_init(r5319707);
        mpfr_init(r5319708);
        mpfr_init(r5319709);
        mpfr_init(r5319710);
        mpfr_init(r5319711);
        mpfr_init(r5319712);
        mpfr_init(r5319713);
        mpfr_init(r5319714);
        mpfr_init(r5319715);
}

double f_im(double a, double b, double eps) {
        mpfr_set_d(r5319699, eps, MPFR_RNDN);
        mpfr_set_d(r5319700, a, MPFR_RNDN);
        mpfr_set_d(r5319701, b, MPFR_RNDN);
        mpfr_add(r5319702, r5319700, r5319701, MPFR_RNDN);
        mpfr_mul(r5319703, r5319702, r5319699, MPFR_RNDN);
        mpfr_exp(r5319704, r5319703, MPFR_RNDN);
        ;
        mpfr_sub(r5319706, r5319704, r5319705, MPFR_RNDN);
        mpfr_mul(r5319707, r5319699, r5319706, MPFR_RNDN);
        mpfr_mul(r5319708, r5319700, r5319699, MPFR_RNDN);
        mpfr_exp(r5319709, r5319708, MPFR_RNDN);
        mpfr_sub(r5319710, r5319709, r5319705, MPFR_RNDN);
        mpfr_mul(r5319711, r5319701, r5319699, MPFR_RNDN);
        mpfr_exp(r5319712, r5319711, MPFR_RNDN);
        mpfr_sub(r5319713, r5319712, r5319705, MPFR_RNDN);
        mpfr_mul(r5319714, r5319710, r5319713, MPFR_RNDN);
        mpfr_div(r5319715, r5319707, r5319714, MPFR_RNDN);
        return mpfr_get_d(r5319715, MPFR_RNDN);
}

static mpfr_t r5319716, r5319717, r5319718, r5319719, r5319720, r5319721, r5319722, r5319723, r5319724, r5319725, r5319726, r5319727, r5319728, r5319729, r5319730, r5319731, r5319732, r5319733, r5319734, r5319735, r5319736, r5319737, r5319738, r5319739, r5319740;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r5319716);
        mpfr_init(r5319717);
        mpfr_init(r5319718);
        mpfr_init_set_str(r5319719, "-7.556090982340352e+135", 10, MPFR_RNDN);
        mpfr_init(r5319720);
        mpfr_init(r5319721);
        mpfr_init(r5319722);
        mpfr_init(r5319723);
        mpfr_init(r5319724);
        mpfr_init_set_str(r5319725, "1", 10, MPFR_RNDN);
        mpfr_init(r5319726);
        mpfr_init(r5319727);
        mpfr_init(r5319728);
        mpfr_init(r5319729);
        mpfr_init(r5319730);
        mpfr_init(r5319731);
        mpfr_init(r5319732);
        mpfr_init(r5319733);
        mpfr_init(r5319734);
        mpfr_init(r5319735);
        mpfr_init(r5319736);
        mpfr_init(r5319737);
        mpfr_init(r5319738);
        mpfr_init(r5319739);
        mpfr_init(r5319740);
}

double f_fm(double a, double b, double eps) {
        mpfr_set_d(r5319716, b, MPFR_RNDN);
        mpfr_set_d(r5319717, eps, MPFR_RNDN);
        mpfr_mul(r5319718, r5319716, r5319717, MPFR_RNDN);
        ;
        mpfr_set_si(r5319720, mpfr_cmp(r5319718, r5319719) <= 0, MPFR_RNDN);
        mpfr_set_d(r5319721, a, MPFR_RNDN);
        mpfr_add(r5319722, r5319721, r5319716, MPFR_RNDN);
        mpfr_mul(r5319723, r5319722, r5319717, MPFR_RNDN);
        mpfr_exp(r5319724, r5319723, MPFR_RNDN);
        ;
        mpfr_sub(r5319726, r5319724, r5319725, MPFR_RNDN);
        mpfr_mul(r5319727, r5319717, r5319726, MPFR_RNDN);
        mpfr_mul(r5319728, r5319721, r5319717, MPFR_RNDN);
        mpfr_exp(r5319729, r5319728, MPFR_RNDN);
        mpfr_sub(r5319730, r5319729, r5319725, MPFR_RNDN);
        mpfr_exp(r5319731, r5319730, MPFR_RNDN);
        mpfr_log(r5319732, r5319731, MPFR_RNDN);
        mpfr_exp(r5319733, r5319718, MPFR_RNDN);
        mpfr_sub(r5319734, r5319733, r5319725, MPFR_RNDN);
        mpfr_mul(r5319735, r5319732, r5319734, MPFR_RNDN);
        mpfr_div(r5319736, r5319727, r5319735, MPFR_RNDN);
        mpfr_div(r5319737, r5319725, r5319716, MPFR_RNDN);
        mpfr_div(r5319738, r5319725, r5319721, MPFR_RNDN);
        mpfr_add(r5319739, r5319737, r5319738, MPFR_RNDN);
        if (mpfr_get_si(r5319720, MPFR_RNDN)) { mpfr_set(r5319740, r5319736, MPFR_RNDN); } else { mpfr_set(r5319740, r5319739, MPFR_RNDN); };
        return mpfr_get_d(r5319740, MPFR_RNDN);
}

static mpfr_t r5319741, r5319742, r5319743, r5319744, r5319745, r5319746, r5319747, r5319748, r5319749, r5319750, r5319751, r5319752, r5319753, r5319754, r5319755, r5319756, r5319757, r5319758, r5319759, r5319760, r5319761, r5319762, r5319763, r5319764, r5319765;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r5319741);
        mpfr_init(r5319742);
        mpfr_init(r5319743);
        mpfr_init_set_str(r5319744, "-7.556090982340352e+135", 10, MPFR_RNDN);
        mpfr_init(r5319745);
        mpfr_init(r5319746);
        mpfr_init(r5319747);
        mpfr_init(r5319748);
        mpfr_init(r5319749);
        mpfr_init_set_str(r5319750, "1", 10, MPFR_RNDN);
        mpfr_init(r5319751);
        mpfr_init(r5319752);
        mpfr_init(r5319753);
        mpfr_init(r5319754);
        mpfr_init(r5319755);
        mpfr_init(r5319756);
        mpfr_init(r5319757);
        mpfr_init(r5319758);
        mpfr_init(r5319759);
        mpfr_init(r5319760);
        mpfr_init(r5319761);
        mpfr_init(r5319762);
        mpfr_init(r5319763);
        mpfr_init(r5319764);
        mpfr_init(r5319765);
}

double f_dm(double a, double b, double eps) {
        mpfr_set_d(r5319741, b, MPFR_RNDN);
        mpfr_set_d(r5319742, eps, MPFR_RNDN);
        mpfr_mul(r5319743, r5319741, r5319742, MPFR_RNDN);
        ;
        mpfr_set_si(r5319745, mpfr_cmp(r5319743, r5319744) <= 0, MPFR_RNDN);
        mpfr_set_d(r5319746, a, MPFR_RNDN);
        mpfr_add(r5319747, r5319746, r5319741, MPFR_RNDN);
        mpfr_mul(r5319748, r5319747, r5319742, MPFR_RNDN);
        mpfr_exp(r5319749, r5319748, MPFR_RNDN);
        ;
        mpfr_sub(r5319751, r5319749, r5319750, MPFR_RNDN);
        mpfr_mul(r5319752, r5319742, r5319751, MPFR_RNDN);
        mpfr_mul(r5319753, r5319746, r5319742, MPFR_RNDN);
        mpfr_exp(r5319754, r5319753, MPFR_RNDN);
        mpfr_sub(r5319755, r5319754, r5319750, MPFR_RNDN);
        mpfr_exp(r5319756, r5319755, MPFR_RNDN);
        mpfr_log(r5319757, r5319756, MPFR_RNDN);
        mpfr_exp(r5319758, r5319743, MPFR_RNDN);
        mpfr_sub(r5319759, r5319758, r5319750, MPFR_RNDN);
        mpfr_mul(r5319760, r5319757, r5319759, MPFR_RNDN);
        mpfr_div(r5319761, r5319752, r5319760, MPFR_RNDN);
        mpfr_div(r5319762, r5319750, r5319741, MPFR_RNDN);
        mpfr_div(r5319763, r5319750, r5319746, MPFR_RNDN);
        mpfr_add(r5319764, r5319762, r5319763, MPFR_RNDN);
        if (mpfr_get_si(r5319745, MPFR_RNDN)) { mpfr_set(r5319765, r5319761, MPFR_RNDN); } else { mpfr_set(r5319765, r5319764, MPFR_RNDN); };
        return mpfr_get_d(r5319765, MPFR_RNDN);
}

