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

char *name = "Kahan's exp quotient";

double f_if(float x) {
        float r45484 = x;
        float r45485 = exp(r45484);
        float r45486 = 1.0f;
        float r45487 = r45485 - r45486;
        float r45488 = r45487 / r45484;
        return r45488;
}

double f_id(double x) {
        double r45489 = x;
        double r45490 = exp(r45489);
        double r45491 = 1.0;
        double r45492 = r45490 - r45491;
        double r45493 = r45492 / r45489;
        return r45493;
}


double f_of(float x) {
        float r45494 = x;
        float r45495 = -5.458497096453193e-06f;
        bool r45496 = r45494 <= r45495;
        float r45497 = exp(r45494);
        float r45498 = 1.0f;
        float r45499 = r45497 - r45498;
        float r45500 = cbrt(r45499);
        float r45501 = r45500 * (r45500 * r45500);
        float r45502 = r45501 / r45494;
        float r45503 = 0.16666666666666666f;
        float r45504 = r45494 * r45494;
        float r45505 = r45503 * r45504;
        float r45506 = 0.5f;
        float r45507 = r45506 * r45494;
        float r45508 = r45507 + r45498;
        float r45509 = r45505 + r45508;
        float r45510 = r45496 ? r45502 : r45509;
        return r45510;
}

double f_od(double x) {
        double r45511 = x;
        double r45512 = -5.458497096453193e-06;
        bool r45513 = r45511 <= r45512;
        double r45514 = exp(r45511);
        double r45515 = 1.0;
        double r45516 = r45514 - r45515;
        double r45517 = cbrt(r45516);
        double r45518 = r45517 * (r45517 * r45517);
        double r45519 = r45518 / r45511;
        double r45520 = 0.16666666666666666;
        double r45521 = r45511 * r45511;
        double r45522 = r45520 * r45521;
        double r45523 = 0.5;
        double r45524 = r45523 * r45511;
        double r45525 = r45524 + r45515;
        double r45526 = r45522 + r45525;
        double r45527 = r45513 ? r45519 : r45526;
        return r45527;
}

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 r45528, r45529, r45530, r45531, r45532;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r45528);
        mpfr_init(r45529);
        mpfr_init_set_str(r45530, "1", 10, MPFR_RNDN);
        mpfr_init(r45531);
        mpfr_init(r45532);
}

double f_im(double x) {
        mpfr_set_d(r45528, x, MPFR_RNDN);
        mpfr_exp(r45529, r45528, MPFR_RNDN);
        ;
        mpfr_sub(r45531, r45529, r45530, MPFR_RNDN);
        mpfr_div(r45532, r45531, r45528, MPFR_RNDN);
        return mpfr_get_d(r45532, MPFR_RNDN);
}

static mpfr_t r45533, r45534, r45535, r45536, r45537, r45538, r45539, r45540, r45541, r45542, r45543, r45544, r45545, r45546, r45547, r45548, r45549;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r45533);
        mpfr_init_set_str(r45534, "-5.458497096453193e-06", 10, MPFR_RNDN);
        mpfr_init(r45535);
        mpfr_init(r45536);
        mpfr_init_set_str(r45537, "1", 10, MPFR_RNDN);
        mpfr_init(r45538);
        mpfr_init(r45539);
        mpfr_init(r45540);
        mpfr_init(r45541);
        mpfr_init_set_str(r45542, "1/6", 10, MPFR_RNDN);
        mpfr_init(r45543);
        mpfr_init(r45544);
        mpfr_init_set_str(r45545, "1/2", 10, MPFR_RNDN);
        mpfr_init(r45546);
        mpfr_init(r45547);
        mpfr_init(r45548);
        mpfr_init(r45549);
}

double f_fm(double x) {
        mpfr_set_d(r45533, x, MPFR_RNDN);
        ;
        mpfr_set_si(r45535, mpfr_cmp(r45533, r45534) <= 0, MPFR_RNDN);
        mpfr_exp(r45536, r45533, MPFR_RNDN);
        ;
        mpfr_sub(r45538, r45536, r45537, MPFR_RNDN);
        mpfr_cbrt(r45539, r45538, MPFR_RNDN);
        mpfr_mul(r45540, r45539, r45539, MPFR_RNDN); mpfr_mul(r45540, r45540, r45539, MPFR_RNDN);
        mpfr_div(r45541, r45540, r45533, MPFR_RNDN);
        ;
        mpfr_sqr(r45543, r45533, MPFR_RNDN);
        mpfr_mul(r45544, r45542, r45543, MPFR_RNDN);
        ;
        mpfr_mul(r45546, r45545, r45533, MPFR_RNDN);
        mpfr_add(r45547, r45546, r45537, MPFR_RNDN);
        mpfr_add(r45548, r45544, r45547, MPFR_RNDN);
        if (mpfr_get_si(r45535, MPFR_RNDN)) { mpfr_set(r45549, r45541, MPFR_RNDN); } else { mpfr_set(r45549, r45548, MPFR_RNDN); };
        return mpfr_get_d(r45549, MPFR_RNDN);
}

static mpfr_t r45550, r45551, r45552, r45553, r45554, r45555, r45556, r45557, r45558, r45559, r45560, r45561, r45562, r45563, r45564, r45565, r45566;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r45550);
        mpfr_init_set_str(r45551, "-5.458497096453193e-06", 10, MPFR_RNDN);
        mpfr_init(r45552);
        mpfr_init(r45553);
        mpfr_init_set_str(r45554, "1", 10, MPFR_RNDN);
        mpfr_init(r45555);
        mpfr_init(r45556);
        mpfr_init(r45557);
        mpfr_init(r45558);
        mpfr_init_set_str(r45559, "1/6", 10, MPFR_RNDN);
        mpfr_init(r45560);
        mpfr_init(r45561);
        mpfr_init_set_str(r45562, "1/2", 10, MPFR_RNDN);
        mpfr_init(r45563);
        mpfr_init(r45564);
        mpfr_init(r45565);
        mpfr_init(r45566);
}

double f_dm(double x) {
        mpfr_set_d(r45550, x, MPFR_RNDN);
        ;
        mpfr_set_si(r45552, mpfr_cmp(r45550, r45551) <= 0, MPFR_RNDN);
        mpfr_exp(r45553, r45550, MPFR_RNDN);
        ;
        mpfr_sub(r45555, r45553, r45554, MPFR_RNDN);
        mpfr_cbrt(r45556, r45555, MPFR_RNDN);
        mpfr_mul(r45557, r45556, r45556, MPFR_RNDN); mpfr_mul(r45557, r45557, r45556, MPFR_RNDN);
        mpfr_div(r45558, r45557, r45550, MPFR_RNDN);
        ;
        mpfr_sqr(r45560, r45550, MPFR_RNDN);
        mpfr_mul(r45561, r45559, r45560, MPFR_RNDN);
        ;
        mpfr_mul(r45563, r45562, r45550, MPFR_RNDN);
        mpfr_add(r45564, r45563, r45554, MPFR_RNDN);
        mpfr_add(r45565, r45561, r45564, MPFR_RNDN);
        if (mpfr_get_si(r45552, MPFR_RNDN)) { mpfr_set(r45566, r45558, MPFR_RNDN); } else { mpfr_set(r45566, r45565, MPFR_RNDN); };
        return mpfr_get_d(r45566, MPFR_RNDN);
}

