#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 r39024 = a;
        float r39025 = x;
        float r39026 = r39024 * r39025;
        float r39027 = exp(r39026);
        float r39028 = 1;
        float r39029 = r39027 - r39028;
        return r39029;
}

double f_id(double a, double x) {
        double r39030 = a;
        double r39031 = x;
        double r39032 = r39030 * r39031;
        double r39033 = exp(r39032);
        double r39034 = 1;
        double r39035 = r39033 - r39034;
        return r39035;
}


double f_of(float a, float x) {
        float r39036 = a;
        float r39037 = x;
        float r39038 = r39036 * r39037;
        float r39039 = -1.4691043195228787e-06;
        bool r39040 = r39038 <= r39039;
        float r39041 = exp(r39038);
        float r39042 = 1;
        float r39043 = r39041 - r39042;
        float r39044 = exp(r39043);
        float r39045 = log(r39044);
        float r39046 = r39037 * r39036;
        float r39047 = r39046 * r39046;
        float r39048 = 1/6;
        float r39049 = r39046 * r39048;
        float r39050 = 1/2;
        float r39051 = r39049 + r39050;
        float r39052 = r39047 * r39051;
        float r39053 = r39052 + r39046;
        float r39054 = r39040 ? r39045 : r39053;
        return r39054;
}

double f_od(double a, double x) {
        double r39055 = a;
        double r39056 = x;
        double r39057 = r39055 * r39056;
        double r39058 = -1.4691043195228787e-06;
        bool r39059 = r39057 <= r39058;
        double r39060 = exp(r39057);
        double r39061 = 1;
        double r39062 = r39060 - r39061;
        double r39063 = exp(r39062);
        double r39064 = log(r39063);
        double r39065 = r39056 * r39055;
        double r39066 = r39065 * r39065;
        double r39067 = 1/6;
        double r39068 = r39065 * r39067;
        double r39069 = 1/2;
        double r39070 = r39068 + r39069;
        double r39071 = r39066 * r39070;
        double r39072 = r39071 + r39065;
        double r39073 = r39059 ? r39064 : r39072;
        return r39073;
}

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 r39074, r39075, r39076, r39077, r39078, r39079;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r39074);
        mpfr_init(r39075);
        mpfr_init(r39076);
        mpfr_init(r39077);
        mpfr_init_set_str(r39078, "1", 10, MPFR_RNDN);
        mpfr_init(r39079);
}

double f_im(double a, double x) {
        mpfr_set_d(r39074, a, MPFR_RNDN);
        mpfr_set_d(r39075, x, MPFR_RNDN);
        mpfr_mul(r39076, r39074, r39075, MPFR_RNDN);
        mpfr_exp(r39077, r39076, MPFR_RNDN);
        ;
        mpfr_sub(r39079, r39077, r39078, MPFR_RNDN);
        return mpfr_get_d(r39079, MPFR_RNDN);
}

static mpfr_t r39080, r39081, r39082, r39083, r39084, r39085, r39086, r39087, r39088, r39089, r39090, r39091, r39092, r39093, r39094, r39095, r39096, r39097, r39098;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r39080);
        mpfr_init(r39081);
        mpfr_init(r39082);
        mpfr_init_set_str(r39083, "-1.4691043195228787e-06", 10, MPFR_RNDN);
        mpfr_init(r39084);
        mpfr_init(r39085);
        mpfr_init_set_str(r39086, "1", 10, MPFR_RNDN);
        mpfr_init(r39087);
        mpfr_init(r39088);
        mpfr_init(r39089);
        mpfr_init(r39090);
        mpfr_init(r39091);
        mpfr_init_set_str(r39092, "1/6", 10, MPFR_RNDN);
        mpfr_init(r39093);
        mpfr_init_set_str(r39094, "1/2", 10, MPFR_RNDN);
        mpfr_init(r39095);
        mpfr_init(r39096);
        mpfr_init(r39097);
        mpfr_init(r39098);
}

double f_fm(double a, double x) {
        mpfr_set_d(r39080, a, MPFR_RNDN);
        mpfr_set_d(r39081, x, MPFR_RNDN);
        mpfr_mul(r39082, r39080, r39081, MPFR_RNDN);
        ;
        mpfr_set_si(r39084, mpfr_cmp(r39082, r39083) <= 0, MPFR_RNDN);
        mpfr_exp(r39085, r39082, MPFR_RNDN);
        ;
        mpfr_sub(r39087, r39085, r39086, MPFR_RNDN);
        mpfr_exp(r39088, r39087, MPFR_RNDN);
        mpfr_log(r39089, r39088, MPFR_RNDN);
        mpfr_mul(r39090, r39081, r39080, MPFR_RNDN);
        mpfr_mul(r39091, r39090, r39090, MPFR_RNDN);
        ;
        mpfr_mul(r39093, r39090, r39092, MPFR_RNDN);
        ;
        mpfr_add(r39095, r39093, r39094, MPFR_RNDN);
        mpfr_mul(r39096, r39091, r39095, MPFR_RNDN);
        mpfr_add(r39097, r39096, r39090, MPFR_RNDN);
        if (mpfr_get_si(r39084, MPFR_RNDN)) { mpfr_set(r39098, r39089, MPFR_RNDN); } else { mpfr_set(r39098, r39097, MPFR_RNDN); };
        return mpfr_get_d(r39098, MPFR_RNDN);
}

static mpfr_t r39099, r39100, r39101, r39102, r39103, r39104, r39105, r39106, r39107, r39108, r39109, r39110, r39111, r39112, r39113, r39114, r39115, r39116, r39117;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r39099);
        mpfr_init(r39100);
        mpfr_init(r39101);
        mpfr_init_set_str(r39102, "-1.4691043195228787e-06", 10, MPFR_RNDN);
        mpfr_init(r39103);
        mpfr_init(r39104);
        mpfr_init_set_str(r39105, "1", 10, MPFR_RNDN);
        mpfr_init(r39106);
        mpfr_init(r39107);
        mpfr_init(r39108);
        mpfr_init(r39109);
        mpfr_init(r39110);
        mpfr_init_set_str(r39111, "1/6", 10, MPFR_RNDN);
        mpfr_init(r39112);
        mpfr_init_set_str(r39113, "1/2", 10, MPFR_RNDN);
        mpfr_init(r39114);
        mpfr_init(r39115);
        mpfr_init(r39116);
        mpfr_init(r39117);
}

double f_dm(double a, double x) {
        mpfr_set_d(r39099, a, MPFR_RNDN);
        mpfr_set_d(r39100, x, MPFR_RNDN);
        mpfr_mul(r39101, r39099, r39100, MPFR_RNDN);
        ;
        mpfr_set_si(r39103, mpfr_cmp(r39101, r39102) <= 0, MPFR_RNDN);
        mpfr_exp(r39104, r39101, MPFR_RNDN);
        ;
        mpfr_sub(r39106, r39104, r39105, MPFR_RNDN);
        mpfr_exp(r39107, r39106, MPFR_RNDN);
        mpfr_log(r39108, r39107, MPFR_RNDN);
        mpfr_mul(r39109, r39100, r39099, MPFR_RNDN);
        mpfr_mul(r39110, r39109, r39109, MPFR_RNDN);
        ;
        mpfr_mul(r39112, r39109, r39111, MPFR_RNDN);
        ;
        mpfr_add(r39114, r39112, r39113, MPFR_RNDN);
        mpfr_mul(r39115, r39110, r39114, MPFR_RNDN);
        mpfr_add(r39116, r39115, r39109, MPFR_RNDN);
        if (mpfr_get_si(r39103, MPFR_RNDN)) { mpfr_set(r39117, r39108, MPFR_RNDN); } else { mpfr_set(r39117, r39116, MPFR_RNDN); };
        return mpfr_get_d(r39117, MPFR_RNDN);
}

