#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 r5181622 = eps;
        float r5181623 = a;
        float r5181624 = b;
        float r5181625 = r5181623 + r5181624;
        float r5181626 = r5181625 * r5181622;
        float r5181627 = exp(r5181626);
        float r5181628 = 1.0f;
        float r5181629 = r5181627 - r5181628;
        float r5181630 = r5181622 * r5181629;
        float r5181631 = r5181623 * r5181622;
        float r5181632 = exp(r5181631);
        float r5181633 = r5181632 - r5181628;
        float r5181634 = r5181624 * r5181622;
        float r5181635 = exp(r5181634);
        float r5181636 = r5181635 - r5181628;
        float r5181637 = r5181633 * r5181636;
        float r5181638 = r5181630 / r5181637;
        return r5181638;
}

double f_id(double a, double b, double eps) {
        double r5181639 = eps;
        double r5181640 = a;
        double r5181641 = b;
        double r5181642 = r5181640 + r5181641;
        double r5181643 = r5181642 * r5181639;
        double r5181644 = exp(r5181643);
        double r5181645 = 1.0;
        double r5181646 = r5181644 - r5181645;
        double r5181647 = r5181639 * r5181646;
        double r5181648 = r5181640 * r5181639;
        double r5181649 = exp(r5181648);
        double r5181650 = r5181649 - r5181645;
        double r5181651 = r5181641 * r5181639;
        double r5181652 = exp(r5181651);
        double r5181653 = r5181652 - r5181645;
        double r5181654 = r5181650 * r5181653;
        double r5181655 = r5181647 / r5181654;
        return r5181655;
}


double f_of(float a, float b, float eps) {
        float r5181656 = b;
        float r5181657 = eps;
        float r5181658 = r5181656 * r5181657;
        float r5181659 = 5.909251882114744e+35f;
        bool r5181660 = r5181658 <= r5181659;
        float r5181661 = 1.0f;
        float r5181662 = a;
        float r5181663 = r5181661 / r5181662;
        float r5181664 = r5181661 / r5181656;
        float r5181665 = r5181663 + r5181664;
        float r5181666 = r5181662 + r5181656;
        float r5181667 = r5181666 * r5181657;
        float r5181668 = exp(r5181667);
        float r5181669 = r5181668 - r5181661;
        float r5181670 = r5181657 * r5181669;
        float r5181671 = r5181662 * r5181657;
        float r5181672 = exp(r5181671);
        float r5181673 = r5181672 - r5181661;
        float r5181674 = r5181673 * (r5181673 * r5181673);
        float r5181675 = cbrt(r5181674);
        float r5181676 = exp(r5181658);
        float r5181677 = r5181676 - r5181661;
        float r5181678 = r5181675 * r5181677;
        float r5181679 = r5181670 / r5181678;
        float r5181680 = r5181660 ? r5181665 : r5181679;
        return r5181680;
}

double f_od(double a, double b, double eps) {
        double r5181681 = b;
        double r5181682 = eps;
        double r5181683 = r5181681 * r5181682;
        double r5181684 = 5.909251882114744e+35;
        bool r5181685 = r5181683 <= r5181684;
        double r5181686 = 1.0;
        double r5181687 = a;
        double r5181688 = r5181686 / r5181687;
        double r5181689 = r5181686 / r5181681;
        double r5181690 = r5181688 + r5181689;
        double r5181691 = r5181687 + r5181681;
        double r5181692 = r5181691 * r5181682;
        double r5181693 = exp(r5181692);
        double r5181694 = r5181693 - r5181686;
        double r5181695 = r5181682 * r5181694;
        double r5181696 = r5181687 * r5181682;
        double r5181697 = exp(r5181696);
        double r5181698 = r5181697 - r5181686;
        double r5181699 = r5181698 * (r5181698 * r5181698);
        double r5181700 = cbrt(r5181699);
        double r5181701 = exp(r5181683);
        double r5181702 = r5181701 - r5181686;
        double r5181703 = r5181700 * r5181702;
        double r5181704 = r5181695 / r5181703;
        double r5181705 = r5181685 ? r5181690 : r5181704;
        return r5181705;
}

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 r5181706, r5181707, r5181708, r5181709, r5181710, r5181711, r5181712, r5181713, r5181714, r5181715, r5181716, r5181717, r5181718, r5181719, r5181720, r5181721, r5181722;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r5181706);
        mpfr_init(r5181707);
        mpfr_init(r5181708);
        mpfr_init(r5181709);
        mpfr_init(r5181710);
        mpfr_init(r5181711);
        mpfr_init_set_str(r5181712, "1", 10, MPFR_RNDN);
        mpfr_init(r5181713);
        mpfr_init(r5181714);
        mpfr_init(r5181715);
        mpfr_init(r5181716);
        mpfr_init(r5181717);
        mpfr_init(r5181718);
        mpfr_init(r5181719);
        mpfr_init(r5181720);
        mpfr_init(r5181721);
        mpfr_init(r5181722);
}

double f_im(double a, double b, double eps) {
        mpfr_set_d(r5181706, eps, MPFR_RNDN);
        mpfr_set_d(r5181707, a, MPFR_RNDN);
        mpfr_set_d(r5181708, b, MPFR_RNDN);
        mpfr_add(r5181709, r5181707, r5181708, MPFR_RNDN);
        mpfr_mul(r5181710, r5181709, r5181706, MPFR_RNDN);
        mpfr_exp(r5181711, r5181710, MPFR_RNDN);
        ;
        mpfr_sub(r5181713, r5181711, r5181712, MPFR_RNDN);
        mpfr_mul(r5181714, r5181706, r5181713, MPFR_RNDN);
        mpfr_mul(r5181715, r5181707, r5181706, MPFR_RNDN);
        mpfr_exp(r5181716, r5181715, MPFR_RNDN);
        mpfr_sub(r5181717, r5181716, r5181712, MPFR_RNDN);
        mpfr_mul(r5181718, r5181708, r5181706, MPFR_RNDN);
        mpfr_exp(r5181719, r5181718, MPFR_RNDN);
        mpfr_sub(r5181720, r5181719, r5181712, MPFR_RNDN);
        mpfr_mul(r5181721, r5181717, r5181720, MPFR_RNDN);
        mpfr_div(r5181722, r5181714, r5181721, MPFR_RNDN);
        return mpfr_get_d(r5181722, MPFR_RNDN);
}

static mpfr_t r5181723, r5181724, r5181725, r5181726, r5181727, r5181728, r5181729, r5181730, r5181731, r5181732, r5181733, r5181734, r5181735, r5181736, r5181737, r5181738, r5181739, r5181740, r5181741, r5181742, r5181743, r5181744, r5181745, r5181746, r5181747;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r5181723);
        mpfr_init(r5181724);
        mpfr_init(r5181725);
        mpfr_init_set_str(r5181726, "5.909251882114744e+35", 10, MPFR_RNDN);
        mpfr_init(r5181727);
        mpfr_init_set_str(r5181728, "1", 10, MPFR_RNDN);
        mpfr_init(r5181729);
        mpfr_init(r5181730);
        mpfr_init(r5181731);
        mpfr_init(r5181732);
        mpfr_init(r5181733);
        mpfr_init(r5181734);
        mpfr_init(r5181735);
        mpfr_init(r5181736);
        mpfr_init(r5181737);
        mpfr_init(r5181738);
        mpfr_init(r5181739);
        mpfr_init(r5181740);
        mpfr_init(r5181741);
        mpfr_init(r5181742);
        mpfr_init(r5181743);
        mpfr_init(r5181744);
        mpfr_init(r5181745);
        mpfr_init(r5181746);
        mpfr_init(r5181747);
}

double f_fm(double a, double b, double eps) {
        mpfr_set_d(r5181723, b, MPFR_RNDN);
        mpfr_set_d(r5181724, eps, MPFR_RNDN);
        mpfr_mul(r5181725, r5181723, r5181724, MPFR_RNDN);
        ;
        mpfr_set_si(r5181727, mpfr_cmp(r5181725, r5181726) <= 0, MPFR_RNDN);
        ;
        mpfr_set_d(r5181729, a, MPFR_RNDN);
        mpfr_div(r5181730, r5181728, r5181729, MPFR_RNDN);
        mpfr_div(r5181731, r5181728, r5181723, MPFR_RNDN);
        mpfr_add(r5181732, r5181730, r5181731, MPFR_RNDN);
        mpfr_add(r5181733, r5181729, r5181723, MPFR_RNDN);
        mpfr_mul(r5181734, r5181733, r5181724, MPFR_RNDN);
        mpfr_exp(r5181735, r5181734, MPFR_RNDN);
        mpfr_sub(r5181736, r5181735, r5181728, MPFR_RNDN);
        mpfr_mul(r5181737, r5181724, r5181736, MPFR_RNDN);
        mpfr_mul(r5181738, r5181729, r5181724, MPFR_RNDN);
        mpfr_exp(r5181739, r5181738, MPFR_RNDN);
        mpfr_sub(r5181740, r5181739, r5181728, MPFR_RNDN);
        mpfr_mul(r5181741, r5181740, r5181740, MPFR_RNDN); mpfr_mul(r5181741, r5181741, r5181740, MPFR_RNDN);
        mpfr_cbrt(r5181742, r5181741, MPFR_RNDN);
        mpfr_exp(r5181743, r5181725, MPFR_RNDN);
        mpfr_sub(r5181744, r5181743, r5181728, MPFR_RNDN);
        mpfr_mul(r5181745, r5181742, r5181744, MPFR_RNDN);
        mpfr_div(r5181746, r5181737, r5181745, MPFR_RNDN);
        if (mpfr_get_si(r5181727, MPFR_RNDN)) { mpfr_set(r5181747, r5181732, MPFR_RNDN); } else { mpfr_set(r5181747, r5181746, MPFR_RNDN); };
        return mpfr_get_d(r5181747, MPFR_RNDN);
}

static mpfr_t r5181748, r5181749, r5181750, r5181751, r5181752, r5181753, r5181754, r5181755, r5181756, r5181757, r5181758, r5181759, r5181760, r5181761, r5181762, r5181763, r5181764, r5181765, r5181766, r5181767, r5181768, r5181769, r5181770, r5181771, r5181772;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r5181748);
        mpfr_init(r5181749);
        mpfr_init(r5181750);
        mpfr_init_set_str(r5181751, "5.909251882114744e+35", 10, MPFR_RNDN);
        mpfr_init(r5181752);
        mpfr_init_set_str(r5181753, "1", 10, MPFR_RNDN);
        mpfr_init(r5181754);
        mpfr_init(r5181755);
        mpfr_init(r5181756);
        mpfr_init(r5181757);
        mpfr_init(r5181758);
        mpfr_init(r5181759);
        mpfr_init(r5181760);
        mpfr_init(r5181761);
        mpfr_init(r5181762);
        mpfr_init(r5181763);
        mpfr_init(r5181764);
        mpfr_init(r5181765);
        mpfr_init(r5181766);
        mpfr_init(r5181767);
        mpfr_init(r5181768);
        mpfr_init(r5181769);
        mpfr_init(r5181770);
        mpfr_init(r5181771);
        mpfr_init(r5181772);
}

double f_dm(double a, double b, double eps) {
        mpfr_set_d(r5181748, b, MPFR_RNDN);
        mpfr_set_d(r5181749, eps, MPFR_RNDN);
        mpfr_mul(r5181750, r5181748, r5181749, MPFR_RNDN);
        ;
        mpfr_set_si(r5181752, mpfr_cmp(r5181750, r5181751) <= 0, MPFR_RNDN);
        ;
        mpfr_set_d(r5181754, a, MPFR_RNDN);
        mpfr_div(r5181755, r5181753, r5181754, MPFR_RNDN);
        mpfr_div(r5181756, r5181753, r5181748, MPFR_RNDN);
        mpfr_add(r5181757, r5181755, r5181756, MPFR_RNDN);
        mpfr_add(r5181758, r5181754, r5181748, MPFR_RNDN);
        mpfr_mul(r5181759, r5181758, r5181749, MPFR_RNDN);
        mpfr_exp(r5181760, r5181759, MPFR_RNDN);
        mpfr_sub(r5181761, r5181760, r5181753, MPFR_RNDN);
        mpfr_mul(r5181762, r5181749, r5181761, MPFR_RNDN);
        mpfr_mul(r5181763, r5181754, r5181749, MPFR_RNDN);
        mpfr_exp(r5181764, r5181763, MPFR_RNDN);
        mpfr_sub(r5181765, r5181764, r5181753, MPFR_RNDN);
        mpfr_mul(r5181766, r5181765, r5181765, MPFR_RNDN); mpfr_mul(r5181766, r5181766, r5181765, MPFR_RNDN);
        mpfr_cbrt(r5181767, r5181766, MPFR_RNDN);
        mpfr_exp(r5181768, r5181750, MPFR_RNDN);
        mpfr_sub(r5181769, r5181768, r5181753, MPFR_RNDN);
        mpfr_mul(r5181770, r5181767, r5181769, MPFR_RNDN);
        mpfr_div(r5181771, r5181762, r5181770, MPFR_RNDN);
        if (mpfr_get_si(r5181752, MPFR_RNDN)) { mpfr_set(r5181772, r5181757, MPFR_RNDN); } else { mpfr_set(r5181772, r5181771, MPFR_RNDN); };
        return mpfr_get_d(r5181772, MPFR_RNDN);
}

