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

char *name = "expax (section 3.5)";

double f_if(float a, float x) {
        float r24396 = a;
        float r24397 = x;
        float r24398 = r24396 * r24397;
        float r24399 = exp(r24398);
        float r24400 = 1;
        float r24401 = r24399 - r24400;
        return r24401;
}

double f_id(double a, double x) {
        double r24402 = a;
        double r24403 = x;
        double r24404 = r24402 * r24403;
        double r24405 = exp(r24404);
        double r24406 = 1;
        double r24407 = r24405 - r24406;
        return r24407;
}


double f_of(float a, float x) {
        float r24408 = a;
        float r24409 = x;
        float r24410 = r24408 * r24409;
        float r24411 = exp(r24410);
        float r24412 = 1;
        float r24413 = r24411 - r24412;
        float r24414 = -6.661338147750938e-16;
        bool r24415 = r24413 <= r24414;
        float r24416 = exp(r24413);
        float r24417 = log(r24416);
        float r24418 = r24410 * r24410;
        float r24419 = 1/6;
        float r24420 = r24410 * r24419;
        float r24421 = 1/2;
        float r24422 = r24420 + r24421;
        float r24423 = r24418 * r24422;
        float r24424 = r24423 + r24410;
        float r24425 = r24415 ? r24417 : r24424;
        return r24425;
}

double f_od(double a, double x) {
        double r24426 = a;
        double r24427 = x;
        double r24428 = r24426 * r24427;
        double r24429 = exp(r24428);
        double r24430 = 1;
        double r24431 = r24429 - r24430;
        double r24432 = -6.661338147750938e-16;
        bool r24433 = r24431 <= r24432;
        double r24434 = exp(r24431);
        double r24435 = log(r24434);
        double r24436 = r24428 * r24428;
        double r24437 = 1/6;
        double r24438 = r24428 * r24437;
        double r24439 = 1/2;
        double r24440 = r24438 + r24439;
        double r24441 = r24436 * r24440;
        double r24442 = r24441 + r24428;
        double r24443 = r24433 ? r24435 : r24442;
        return r24443;
}

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 r24444, r24445, r24446, r24447, r24448, r24449;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r24444);
        mpfr_init(r24445);
        mpfr_init(r24446);
        mpfr_init(r24447);
        mpfr_init_set_str(r24448, "1", 10, MPFR_RNDN);
        mpfr_init(r24449);
}

double f_im(double a, double x) {
        mpfr_set_d(r24444, a, MPFR_RNDN);
        mpfr_set_d(r24445, x, MPFR_RNDN);
        mpfr_mul(r24446, r24444, r24445, MPFR_RNDN);
        mpfr_exp(r24447, r24446, MPFR_RNDN);
        ;
        mpfr_sub(r24449, r24447, r24448, MPFR_RNDN);
        return mpfr_get_d(r24449, MPFR_RNDN);
}

static mpfr_t r24450, r24451, r24452, r24453, r24454, r24455, r24456, r24457, r24458, r24459, r24460, r24461, r24462, r24463, r24464, r24465, r24466, r24467;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r24450);
        mpfr_init(r24451);
        mpfr_init(r24452);
        mpfr_init(r24453);
        mpfr_init_set_str(r24454, "1", 10, MPFR_RNDN);
        mpfr_init(r24455);
        mpfr_init_set_str(r24456, "-6.661338147750938e-16", 10, MPFR_RNDN);
        mpfr_init(r24457);
        mpfr_init(r24458);
        mpfr_init(r24459);
        mpfr_init(r24460);
        mpfr_init_set_str(r24461, "1/6", 10, MPFR_RNDN);
        mpfr_init(r24462);
        mpfr_init_set_str(r24463, "1/2", 10, MPFR_RNDN);
        mpfr_init(r24464);
        mpfr_init(r24465);
        mpfr_init(r24466);
        mpfr_init(r24467);
}

double f_fm(double a, double x) {
        mpfr_set_d(r24450, a, MPFR_RNDN);
        mpfr_set_d(r24451, x, MPFR_RNDN);
        mpfr_mul(r24452, r24450, r24451, MPFR_RNDN);
        mpfr_exp(r24453, r24452, MPFR_RNDN);
        ;
        mpfr_sub(r24455, r24453, r24454, MPFR_RNDN);
        ;
        mpfr_set_si(r24457, mpfr_cmp(r24455, r24456) <= 0, MPFR_RNDN);
        mpfr_exp(r24458, r24455, MPFR_RNDN);
        mpfr_log(r24459, r24458, MPFR_RNDN);
        mpfr_mul(r24460, r24452, r24452, MPFR_RNDN);
        ;
        mpfr_mul(r24462, r24452, r24461, MPFR_RNDN);
        ;
        mpfr_add(r24464, r24462, r24463, MPFR_RNDN);
        mpfr_mul(r24465, r24460, r24464, MPFR_RNDN);
        mpfr_add(r24466, r24465, r24452, MPFR_RNDN);
        if (mpfr_get_si(r24457, MPFR_RNDN)) { mpfr_set(r24467, r24459, MPFR_RNDN); } else { mpfr_set(r24467, r24466, MPFR_RNDN); };
        return mpfr_get_d(r24467, MPFR_RNDN);
}

static mpfr_t r24468, r24469, r24470, r24471, r24472, r24473, r24474, r24475, r24476, r24477, r24478, r24479, r24480, r24481, r24482, r24483, r24484, r24485;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r24468);
        mpfr_init(r24469);
        mpfr_init(r24470);
        mpfr_init(r24471);
        mpfr_init_set_str(r24472, "1", 10, MPFR_RNDN);
        mpfr_init(r24473);
        mpfr_init_set_str(r24474, "-6.661338147750938e-16", 10, MPFR_RNDN);
        mpfr_init(r24475);
        mpfr_init(r24476);
        mpfr_init(r24477);
        mpfr_init(r24478);
        mpfr_init_set_str(r24479, "1/6", 10, MPFR_RNDN);
        mpfr_init(r24480);
        mpfr_init_set_str(r24481, "1/2", 10, MPFR_RNDN);
        mpfr_init(r24482);
        mpfr_init(r24483);
        mpfr_init(r24484);
        mpfr_init(r24485);
}

double f_dm(double a, double x) {
        mpfr_set_d(r24468, a, MPFR_RNDN);
        mpfr_set_d(r24469, x, MPFR_RNDN);
        mpfr_mul(r24470, r24468, r24469, MPFR_RNDN);
        mpfr_exp(r24471, r24470, MPFR_RNDN);
        ;
        mpfr_sub(r24473, r24471, r24472, MPFR_RNDN);
        ;
        mpfr_set_si(r24475, mpfr_cmp(r24473, r24474) <= 0, MPFR_RNDN);
        mpfr_exp(r24476, r24473, MPFR_RNDN);
        mpfr_log(r24477, r24476, MPFR_RNDN);
        mpfr_mul(r24478, r24470, r24470, MPFR_RNDN);
        ;
        mpfr_mul(r24480, r24470, r24479, MPFR_RNDN);
        ;
        mpfr_add(r24482, r24480, r24481, MPFR_RNDN);
        mpfr_mul(r24483, r24478, r24482, MPFR_RNDN);
        mpfr_add(r24484, r24483, r24470, MPFR_RNDN);
        if (mpfr_get_si(r24475, MPFR_RNDN)) { mpfr_set(r24485, r24477, MPFR_RNDN); } else { mpfr_set(r24485, r24484, MPFR_RNDN); };
        return mpfr_get_d(r24485, MPFR_RNDN);
}

