#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 r48519 = x;
        float r48520 = exp(r48519);
        float r48521 = 1;
        float r48522 = r48520 - r48521;
        float r48523 = r48522 / r48519;
        return r48523;
}

double f_id(double x) {
        double r48524 = x;
        double r48525 = exp(r48524);
        double r48526 = 1;
        double r48527 = r48525 - r48526;
        double r48528 = r48527 / r48524;
        return r48528;
}


double f_of(float x) {
        float r48529 = x;
        float r48530 = -4.937900603750566e-17;
        bool r48531 = r48529 <= r48530;
        float r48532 = exp(r48529);
        float r48533 = 1;
        float r48534 = r48532 - r48533;
        float r48535 = exp(r48534);
        float r48536 = log(r48535);
        float r48537 = r48536 / r48529;
        float r48538 = 1/6;
        float r48539 = 2;
        float r48540 = pow(r48529, r48539);
        float r48541 = r48538 * r48540;
        float r48542 = 1/2;
        float r48543 = r48542 * r48529;
        float r48544 = r48533 + r48543;
        float r48545 = r48541 + r48544;
        float r48546 = r48531 ? r48537 : r48545;
        return r48546;
}

double f_od(double x) {
        double r48547 = x;
        double r48548 = -4.937900603750566e-17;
        bool r48549 = r48547 <= r48548;
        double r48550 = exp(r48547);
        double r48551 = 1;
        double r48552 = r48550 - r48551;
        double r48553 = exp(r48552);
        double r48554 = log(r48553);
        double r48555 = r48554 / r48547;
        double r48556 = 1/6;
        double r48557 = 2;
        double r48558 = pow(r48547, r48557);
        double r48559 = r48556 * r48558;
        double r48560 = 1/2;
        double r48561 = r48560 * r48547;
        double r48562 = r48551 + r48561;
        double r48563 = r48559 + r48562;
        double r48564 = r48549 ? r48555 : r48563;
        return r48564;
}

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 r48565, r48566, r48567, r48568, r48569;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r48565);
        mpfr_init(r48566);
        mpfr_init_set_str(r48567, "1", 10, MPFR_RNDN);
        mpfr_init(r48568);
        mpfr_init(r48569);
}

double f_im(double x) {
        mpfr_set_d(r48565, x, MPFR_RNDN);
        mpfr_exp(r48566, r48565, MPFR_RNDN);
        ;
        mpfr_sub(r48568, r48566, r48567, MPFR_RNDN);
        mpfr_div(r48569, r48568, r48565, MPFR_RNDN);
        return mpfr_get_d(r48569, MPFR_RNDN);
}

static mpfr_t r48570, r48571, r48572, r48573, r48574, r48575, r48576, r48577, r48578, r48579, r48580, r48581, r48582, r48583, r48584, r48585, r48586, r48587;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r48570);
        mpfr_init_set_str(r48571, "-4.937900603750566e-17", 10, MPFR_RNDN);
        mpfr_init(r48572);
        mpfr_init(r48573);
        mpfr_init_set_str(r48574, "1", 10, MPFR_RNDN);
        mpfr_init(r48575);
        mpfr_init(r48576);
        mpfr_init(r48577);
        mpfr_init(r48578);
        mpfr_init_set_str(r48579, "1/6", 10, MPFR_RNDN);
        mpfr_init_set_str(r48580, "2", 10, MPFR_RNDN);
        mpfr_init(r48581);
        mpfr_init(r48582);
        mpfr_init_set_str(r48583, "1/2", 10, MPFR_RNDN);
        mpfr_init(r48584);
        mpfr_init(r48585);
        mpfr_init(r48586);
        mpfr_init(r48587);
}

double f_fm(double x) {
        mpfr_set_d(r48570, x, MPFR_RNDN);
        ;
        mpfr_set_si(r48572, mpfr_cmp(r48570, r48571) <= 0, MPFR_RNDN);
        mpfr_exp(r48573, r48570, MPFR_RNDN);
        ;
        mpfr_sub(r48575, r48573, r48574, MPFR_RNDN);
        mpfr_exp(r48576, r48575, MPFR_RNDN);
        mpfr_log(r48577, r48576, MPFR_RNDN);
        mpfr_div(r48578, r48577, r48570, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r48581, r48570, r48580, MPFR_RNDN);
        mpfr_mul(r48582, r48579, r48581, MPFR_RNDN);
        ;
        mpfr_mul(r48584, r48583, r48570, MPFR_RNDN);
        mpfr_add(r48585, r48574, r48584, MPFR_RNDN);
        mpfr_add(r48586, r48582, r48585, MPFR_RNDN);
        if (mpfr_get_si(r48572, MPFR_RNDN)) { mpfr_set(r48587, r48578, MPFR_RNDN); } else { mpfr_set(r48587, r48586, MPFR_RNDN); };
        return mpfr_get_d(r48587, MPFR_RNDN);
}

static mpfr_t r48588, r48589, r48590, r48591, r48592, r48593, r48594, r48595, r48596, r48597, r48598, r48599, r48600, r48601, r48602, r48603, r48604, r48605;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r48588);
        mpfr_init_set_str(r48589, "-4.937900603750566e-17", 10, MPFR_RNDN);
        mpfr_init(r48590);
        mpfr_init(r48591);
        mpfr_init_set_str(r48592, "1", 10, MPFR_RNDN);
        mpfr_init(r48593);
        mpfr_init(r48594);
        mpfr_init(r48595);
        mpfr_init(r48596);
        mpfr_init_set_str(r48597, "1/6", 10, MPFR_RNDN);
        mpfr_init_set_str(r48598, "2", 10, MPFR_RNDN);
        mpfr_init(r48599);
        mpfr_init(r48600);
        mpfr_init_set_str(r48601, "1/2", 10, MPFR_RNDN);
        mpfr_init(r48602);
        mpfr_init(r48603);
        mpfr_init(r48604);
        mpfr_init(r48605);
}

double f_dm(double x) {
        mpfr_set_d(r48588, x, MPFR_RNDN);
        ;
        mpfr_set_si(r48590, mpfr_cmp(r48588, r48589) <= 0, MPFR_RNDN);
        mpfr_exp(r48591, r48588, MPFR_RNDN);
        ;
        mpfr_sub(r48593, r48591, r48592, MPFR_RNDN);
        mpfr_exp(r48594, r48593, MPFR_RNDN);
        mpfr_log(r48595, r48594, MPFR_RNDN);
        mpfr_div(r48596, r48595, r48588, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r48599, r48588, r48598, MPFR_RNDN);
        mpfr_mul(r48600, r48597, r48599, MPFR_RNDN);
        ;
        mpfr_mul(r48602, r48601, r48588, MPFR_RNDN);
        mpfr_add(r48603, r48592, r48602, MPFR_RNDN);
        mpfr_add(r48604, r48600, r48603, MPFR_RNDN);
        if (mpfr_get_si(r48590, MPFR_RNDN)) { mpfr_set(r48605, r48596, MPFR_RNDN); } else { mpfr_set(r48605, r48604, MPFR_RNDN); };
        return mpfr_get_d(r48605, MPFR_RNDN);
}

