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

char *name = "expq3 (problem 3.4.2)";

double f_if(float a, float b, float eps) {
        float r6215592 = eps;
        float r6215593 = a;
        float r6215594 = b;
        float r6215595 = r6215593 + r6215594;
        float r6215596 = r6215595 * r6215592;
        float r6215597 = exp(r6215596);
        float r6215598 = 1;
        float r6215599 = r6215597 - r6215598;
        float r6215600 = r6215592 * r6215599;
        float r6215601 = r6215593 * r6215592;
        float r6215602 = exp(r6215601);
        float r6215603 = r6215602 - r6215598;
        float r6215604 = r6215594 * r6215592;
        float r6215605 = exp(r6215604);
        float r6215606 = r6215605 - r6215598;
        float r6215607 = r6215603 * r6215606;
        float r6215608 = r6215600 / r6215607;
        return r6215608;
}

double f_id(double a, double b, double eps) {
        double r6215609 = eps;
        double r6215610 = a;
        double r6215611 = b;
        double r6215612 = r6215610 + r6215611;
        double r6215613 = r6215612 * r6215609;
        double r6215614 = exp(r6215613);
        double r6215615 = 1;
        double r6215616 = r6215614 - r6215615;
        double r6215617 = r6215609 * r6215616;
        double r6215618 = r6215610 * r6215609;
        double r6215619 = exp(r6215618);
        double r6215620 = r6215619 - r6215615;
        double r6215621 = r6215611 * r6215609;
        double r6215622 = exp(r6215621);
        double r6215623 = r6215622 - r6215615;
        double r6215624 = r6215620 * r6215623;
        double r6215625 = r6215617 / r6215624;
        return r6215625;
}


double f_of(float a, float b, float eps) {
        float r6215626 = a;
        float r6215627 = eps;
        float r6215628 = r6215626 * r6215627;
        float r6215629 = 6.507018077965857e-08;
        bool r6215630 = r6215628 <= r6215629;
        float r6215631 = 1;
        float r6215632 = r6215631 / r6215626;
        float r6215633 = b;
        float r6215634 = r6215631 / r6215633;
        float r6215635 = r6215632 + r6215634;
        float r6215636 = exp(r6215627);
        float r6215637 = r6215633 + r6215626;
        float r6215638 = pow(r6215636, r6215637);
        float r6215639 = r6215638 - r6215631;
        float r6215640 = r6215633 * r6215627;
        float r6215641 = exp(r6215640);
        float r6215642 = r6215641 - r6215631;
        float r6215643 = r6215639 / r6215642;
        float r6215644 = exp(r6215628);
        float r6215645 = r6215644 - r6215631;
        float r6215646 = r6215645 / r6215627;
        float r6215647 = r6215643 / r6215646;
        float r6215648 = r6215630 ? r6215635 : r6215647;
        return r6215648;
}

double f_od(double a, double b, double eps) {
        double r6215649 = a;
        double r6215650 = eps;
        double r6215651 = r6215649 * r6215650;
        double r6215652 = 6.507018077965857e-08;
        bool r6215653 = r6215651 <= r6215652;
        double r6215654 = 1;
        double r6215655 = r6215654 / r6215649;
        double r6215656 = b;
        double r6215657 = r6215654 / r6215656;
        double r6215658 = r6215655 + r6215657;
        double r6215659 = exp(r6215650);
        double r6215660 = r6215656 + r6215649;
        double r6215661 = pow(r6215659, r6215660);
        double r6215662 = r6215661 - r6215654;
        double r6215663 = r6215656 * r6215650;
        double r6215664 = exp(r6215663);
        double r6215665 = r6215664 - r6215654;
        double r6215666 = r6215662 / r6215665;
        double r6215667 = exp(r6215651);
        double r6215668 = r6215667 - r6215654;
        double r6215669 = r6215668 / r6215650;
        double r6215670 = r6215666 / r6215669;
        double r6215671 = r6215653 ? r6215658 : r6215670;
        return r6215671;
}

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 r6215672, r6215673, r6215674, r6215675, r6215676, r6215677, r6215678, r6215679, r6215680, r6215681, r6215682, r6215683, r6215684, r6215685, r6215686, r6215687, r6215688;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r6215672);
        mpfr_init(r6215673);
        mpfr_init(r6215674);
        mpfr_init(r6215675);
        mpfr_init(r6215676);
        mpfr_init(r6215677);
        mpfr_init_set_str(r6215678, "1", 10, MPFR_RNDN);
        mpfr_init(r6215679);
        mpfr_init(r6215680);
        mpfr_init(r6215681);
        mpfr_init(r6215682);
        mpfr_init(r6215683);
        mpfr_init(r6215684);
        mpfr_init(r6215685);
        mpfr_init(r6215686);
        mpfr_init(r6215687);
        mpfr_init(r6215688);
}

double f_im(double a, double b, double eps) {
        mpfr_set_d(r6215672, eps, MPFR_RNDN);
        mpfr_set_d(r6215673, a, MPFR_RNDN);
        mpfr_set_d(r6215674, b, MPFR_RNDN);
        mpfr_add(r6215675, r6215673, r6215674, MPFR_RNDN);
        mpfr_mul(r6215676, r6215675, r6215672, MPFR_RNDN);
        mpfr_exp(r6215677, r6215676, MPFR_RNDN);
        ;
        mpfr_sub(r6215679, r6215677, r6215678, MPFR_RNDN);
        mpfr_mul(r6215680, r6215672, r6215679, MPFR_RNDN);
        mpfr_mul(r6215681, r6215673, r6215672, MPFR_RNDN);
        mpfr_exp(r6215682, r6215681, MPFR_RNDN);
        mpfr_sub(r6215683, r6215682, r6215678, MPFR_RNDN);
        mpfr_mul(r6215684, r6215674, r6215672, MPFR_RNDN);
        mpfr_exp(r6215685, r6215684, MPFR_RNDN);
        mpfr_sub(r6215686, r6215685, r6215678, MPFR_RNDN);
        mpfr_mul(r6215687, r6215683, r6215686, MPFR_RNDN);
        mpfr_div(r6215688, r6215680, r6215687, MPFR_RNDN);
        return mpfr_get_d(r6215688, MPFR_RNDN);
}

static mpfr_t r6215689, r6215690, r6215691, r6215692, r6215693, r6215694, r6215695, r6215696, r6215697, r6215698, r6215699, r6215700, r6215701, r6215702, r6215703, r6215704, r6215705, r6215706, r6215707, r6215708, r6215709, r6215710, r6215711;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r6215689);
        mpfr_init(r6215690);
        mpfr_init(r6215691);
        mpfr_init_set_str(r6215692, "6.507018077965857e-08", 10, MPFR_RNDN);
        mpfr_init(r6215693);
        mpfr_init_set_str(r6215694, "1", 10, MPFR_RNDN);
        mpfr_init(r6215695);
        mpfr_init(r6215696);
        mpfr_init(r6215697);
        mpfr_init(r6215698);
        mpfr_init(r6215699);
        mpfr_init(r6215700);
        mpfr_init(r6215701);
        mpfr_init(r6215702);
        mpfr_init(r6215703);
        mpfr_init(r6215704);
        mpfr_init(r6215705);
        mpfr_init(r6215706);
        mpfr_init(r6215707);
        mpfr_init(r6215708);
        mpfr_init(r6215709);
        mpfr_init(r6215710);
        mpfr_init(r6215711);
}

double f_fm(double a, double b, double eps) {
        mpfr_set_d(r6215689, a, MPFR_RNDN);
        mpfr_set_d(r6215690, eps, MPFR_RNDN);
        mpfr_mul(r6215691, r6215689, r6215690, MPFR_RNDN);
        ;
        mpfr_set_si(r6215693, mpfr_cmp(r6215691, r6215692) <= 0, MPFR_RNDN);
        ;
        mpfr_div(r6215695, r6215694, r6215689, MPFR_RNDN);
        mpfr_set_d(r6215696, b, MPFR_RNDN);
        mpfr_div(r6215697, r6215694, r6215696, MPFR_RNDN);
        mpfr_add(r6215698, r6215695, r6215697, MPFR_RNDN);
        mpfr_exp(r6215699, r6215690, MPFR_RNDN);
        mpfr_add(r6215700, r6215696, r6215689, MPFR_RNDN);
        mpfr_pow(r6215701, r6215699, r6215700, MPFR_RNDN);
        mpfr_sub(r6215702, r6215701, r6215694, MPFR_RNDN);
        mpfr_mul(r6215703, r6215696, r6215690, MPFR_RNDN);
        mpfr_exp(r6215704, r6215703, MPFR_RNDN);
        mpfr_sub(r6215705, r6215704, r6215694, MPFR_RNDN);
        mpfr_div(r6215706, r6215702, r6215705, MPFR_RNDN);
        mpfr_exp(r6215707, r6215691, MPFR_RNDN);
        mpfr_sub(r6215708, r6215707, r6215694, MPFR_RNDN);
        mpfr_div(r6215709, r6215708, r6215690, MPFR_RNDN);
        mpfr_div(r6215710, r6215706, r6215709, MPFR_RNDN);
        if (mpfr_get_si(r6215693, MPFR_RNDN)) { mpfr_set(r6215711, r6215698, MPFR_RNDN); } else { mpfr_set(r6215711, r6215710, MPFR_RNDN); };
        return mpfr_get_d(r6215711, MPFR_RNDN);
}

static mpfr_t r6215712, r6215713, r6215714, r6215715, r6215716, r6215717, r6215718, r6215719, r6215720, r6215721, r6215722, r6215723, r6215724, r6215725, r6215726, r6215727, r6215728, r6215729, r6215730, r6215731, r6215732, r6215733, r6215734;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r6215712);
        mpfr_init(r6215713);
        mpfr_init(r6215714);
        mpfr_init_set_str(r6215715, "6.507018077965857e-08", 10, MPFR_RNDN);
        mpfr_init(r6215716);
        mpfr_init_set_str(r6215717, "1", 10, MPFR_RNDN);
        mpfr_init(r6215718);
        mpfr_init(r6215719);
        mpfr_init(r6215720);
        mpfr_init(r6215721);
        mpfr_init(r6215722);
        mpfr_init(r6215723);
        mpfr_init(r6215724);
        mpfr_init(r6215725);
        mpfr_init(r6215726);
        mpfr_init(r6215727);
        mpfr_init(r6215728);
        mpfr_init(r6215729);
        mpfr_init(r6215730);
        mpfr_init(r6215731);
        mpfr_init(r6215732);
        mpfr_init(r6215733);
        mpfr_init(r6215734);
}

double f_dm(double a, double b, double eps) {
        mpfr_set_d(r6215712, a, MPFR_RNDN);
        mpfr_set_d(r6215713, eps, MPFR_RNDN);
        mpfr_mul(r6215714, r6215712, r6215713, MPFR_RNDN);
        ;
        mpfr_set_si(r6215716, mpfr_cmp(r6215714, r6215715) <= 0, MPFR_RNDN);
        ;
        mpfr_div(r6215718, r6215717, r6215712, MPFR_RNDN);
        mpfr_set_d(r6215719, b, MPFR_RNDN);
        mpfr_div(r6215720, r6215717, r6215719, MPFR_RNDN);
        mpfr_add(r6215721, r6215718, r6215720, MPFR_RNDN);
        mpfr_exp(r6215722, r6215713, MPFR_RNDN);
        mpfr_add(r6215723, r6215719, r6215712, MPFR_RNDN);
        mpfr_pow(r6215724, r6215722, r6215723, MPFR_RNDN);
        mpfr_sub(r6215725, r6215724, r6215717, MPFR_RNDN);
        mpfr_mul(r6215726, r6215719, r6215713, MPFR_RNDN);
        mpfr_exp(r6215727, r6215726, MPFR_RNDN);
        mpfr_sub(r6215728, r6215727, r6215717, MPFR_RNDN);
        mpfr_div(r6215729, r6215725, r6215728, MPFR_RNDN);
        mpfr_exp(r6215730, r6215714, MPFR_RNDN);
        mpfr_sub(r6215731, r6215730, r6215717, MPFR_RNDN);
        mpfr_div(r6215732, r6215731, r6215713, MPFR_RNDN);
        mpfr_div(r6215733, r6215729, r6215732, MPFR_RNDN);
        if (mpfr_get_si(r6215716, MPFR_RNDN)) { mpfr_set(r6215734, r6215721, MPFR_RNDN); } else { mpfr_set(r6215734, r6215733, MPFR_RNDN); };
        return mpfr_get_d(r6215734, MPFR_RNDN);
}

