#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 r48367 = x;
        float r48368 = exp(r48367);
        float r48369 = 1;
        float r48370 = r48368 - r48369;
        float r48371 = r48370 / r48367;
        return r48371;
}

double f_id(double x) {
        double r48372 = x;
        double r48373 = exp(r48372);
        double r48374 = 1;
        double r48375 = r48373 - r48374;
        double r48376 = r48375 / r48372;
        return r48376;
}


double f_of(float x) {
        float r48377 = x;
        float r48378 = -0.00014973358176513608;
        bool r48379 = r48377 <= r48378;
        float r48380 = exp(r48377);
        float r48381 = 1;
        float r48382 = r48380 - r48381;
        float r48383 = exp(r48382);
        float r48384 = log(r48383);
        float r48385 = r48384 / r48377;
        float r48386 = 1/6;
        float r48387 = 2;
        float r48388 = pow(r48377, r48387);
        float r48389 = r48386 * r48388;
        float r48390 = 1/2;
        float r48391 = r48390 * r48377;
        float r48392 = r48381 + r48391;
        float r48393 = r48389 + r48392;
        float r48394 = r48379 ? r48385 : r48393;
        return r48394;
}

double f_od(double x) {
        double r48395 = x;
        double r48396 = -0.00014973358176513608;
        bool r48397 = r48395 <= r48396;
        double r48398 = exp(r48395);
        double r48399 = 1;
        double r48400 = r48398 - r48399;
        double r48401 = exp(r48400);
        double r48402 = log(r48401);
        double r48403 = r48402 / r48395;
        double r48404 = 1/6;
        double r48405 = 2;
        double r48406 = pow(r48395, r48405);
        double r48407 = r48404 * r48406;
        double r48408 = 1/2;
        double r48409 = r48408 * r48395;
        double r48410 = r48399 + r48409;
        double r48411 = r48407 + r48410;
        double r48412 = r48397 ? r48403 : r48411;
        return r48412;
}

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 r48413, r48414, r48415, r48416, r48417;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r48413);
        mpfr_init(r48414);
        mpfr_init_set_str(r48415, "1", 10, MPFR_RNDN);
        mpfr_init(r48416);
        mpfr_init(r48417);
}

double f_im(double x) {
        mpfr_set_d(r48413, x, MPFR_RNDN);
        mpfr_exp(r48414, r48413, MPFR_RNDN);
        ;
        mpfr_sub(r48416, r48414, r48415, MPFR_RNDN);
        mpfr_div(r48417, r48416, r48413, MPFR_RNDN);
        return mpfr_get_d(r48417, MPFR_RNDN);
}

static mpfr_t r48418, r48419, r48420, r48421, r48422, r48423, r48424, r48425, r48426, r48427, r48428, r48429, r48430, r48431, r48432, r48433, r48434, r48435;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r48418);
        mpfr_init_set_str(r48419, "-0.00014973358176513608", 10, MPFR_RNDN);
        mpfr_init(r48420);
        mpfr_init(r48421);
        mpfr_init_set_str(r48422, "1", 10, MPFR_RNDN);
        mpfr_init(r48423);
        mpfr_init(r48424);
        mpfr_init(r48425);
        mpfr_init(r48426);
        mpfr_init_set_str(r48427, "1/6", 10, MPFR_RNDN);
        mpfr_init_set_str(r48428, "2", 10, MPFR_RNDN);
        mpfr_init(r48429);
        mpfr_init(r48430);
        mpfr_init_set_str(r48431, "1/2", 10, MPFR_RNDN);
        mpfr_init(r48432);
        mpfr_init(r48433);
        mpfr_init(r48434);
        mpfr_init(r48435);
}

double f_fm(double x) {
        mpfr_set_d(r48418, x, MPFR_RNDN);
        ;
        mpfr_set_si(r48420, mpfr_cmp(r48418, r48419) <= 0, MPFR_RNDN);
        mpfr_exp(r48421, r48418, MPFR_RNDN);
        ;
        mpfr_sub(r48423, r48421, r48422, MPFR_RNDN);
        mpfr_exp(r48424, r48423, MPFR_RNDN);
        mpfr_log(r48425, r48424, MPFR_RNDN);
        mpfr_div(r48426, r48425, r48418, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r48429, r48418, r48428, MPFR_RNDN);
        mpfr_mul(r48430, r48427, r48429, MPFR_RNDN);
        ;
        mpfr_mul(r48432, r48431, r48418, MPFR_RNDN);
        mpfr_add(r48433, r48422, r48432, MPFR_RNDN);
        mpfr_add(r48434, r48430, r48433, MPFR_RNDN);
        if (mpfr_get_si(r48420, MPFR_RNDN)) { mpfr_set(r48435, r48426, MPFR_RNDN); } else { mpfr_set(r48435, r48434, MPFR_RNDN); };
        return mpfr_get_d(r48435, MPFR_RNDN);
}

static mpfr_t r48436, r48437, r48438, r48439, r48440, r48441, r48442, r48443, r48444, r48445, r48446, r48447, r48448, r48449, r48450, r48451, r48452, r48453;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r48436);
        mpfr_init_set_str(r48437, "-0.00014973358176513608", 10, MPFR_RNDN);
        mpfr_init(r48438);
        mpfr_init(r48439);
        mpfr_init_set_str(r48440, "1", 10, MPFR_RNDN);
        mpfr_init(r48441);
        mpfr_init(r48442);
        mpfr_init(r48443);
        mpfr_init(r48444);
        mpfr_init_set_str(r48445, "1/6", 10, MPFR_RNDN);
        mpfr_init_set_str(r48446, "2", 10, MPFR_RNDN);
        mpfr_init(r48447);
        mpfr_init(r48448);
        mpfr_init_set_str(r48449, "1/2", 10, MPFR_RNDN);
        mpfr_init(r48450);
        mpfr_init(r48451);
        mpfr_init(r48452);
        mpfr_init(r48453);
}

double f_dm(double x) {
        mpfr_set_d(r48436, x, MPFR_RNDN);
        ;
        mpfr_set_si(r48438, mpfr_cmp(r48436, r48437) <= 0, MPFR_RNDN);
        mpfr_exp(r48439, r48436, MPFR_RNDN);
        ;
        mpfr_sub(r48441, r48439, r48440, MPFR_RNDN);
        mpfr_exp(r48442, r48441, MPFR_RNDN);
        mpfr_log(r48443, r48442, MPFR_RNDN);
        mpfr_div(r48444, r48443, r48436, MPFR_RNDN);
        ;
        ;
        mpfr_pow(r48447, r48436, r48446, MPFR_RNDN);
        mpfr_mul(r48448, r48445, r48447, MPFR_RNDN);
        ;
        mpfr_mul(r48450, r48449, r48436, MPFR_RNDN);
        mpfr_add(r48451, r48440, r48450, MPFR_RNDN);
        mpfr_add(r48452, r48448, r48451, MPFR_RNDN);
        if (mpfr_get_si(r48438, MPFR_RNDN)) { mpfr_set(r48453, r48444, MPFR_RNDN); } else { mpfr_set(r48453, r48452, MPFR_RNDN); };
        return mpfr_get_d(r48453, MPFR_RNDN);
}

