#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 r4941039 = a;
        float r4941040 = x;
        float r4941041 = r4941039 * r4941040;
        float r4941042 = exp(r4941041);
        float r4941043 = 1.0f;
        float r4941044 = r4941042 - r4941043;
        return r4941044;
}

double f_id(double a, double x) {
        double r4941045 = a;
        double r4941046 = x;
        double r4941047 = r4941045 * r4941046;
        double r4941048 = exp(r4941047);
        double r4941049 = 1.0;
        double r4941050 = r4941048 - r4941049;
        return r4941050;
}


double f_of(float a, float x) {
        float r4941051 = a;
        float r4941052 = x;
        float r4941053 = r4941051 * r4941052;
        float r4941054 = -3.0996483699306456e-06f;
        bool r4941055 = r4941053 <= r4941054;
        float r4941056 = exp(r4941053);
        float r4941057 = 1.0f;
        float r4941058 = r4941056 - r4941057;
        float r4941059 = exp(r4941058);
        float r4941060 = log(r4941059);
        float r4941061 = 0.5f;
        float r4941062 = r4941053 * r4941053;
        float r4941063 = r4941061 * r4941062;
        float r4941064 = r4941063 + r4941053;
        float r4941065 = r4941055 ? r4941060 : r4941064;
        return r4941065;
}

double f_od(double a, double x) {
        double r4941066 = a;
        double r4941067 = x;
        double r4941068 = r4941066 * r4941067;
        double r4941069 = -3.0996483699306456e-06;
        bool r4941070 = r4941068 <= r4941069;
        double r4941071 = exp(r4941068);
        double r4941072 = 1.0;
        double r4941073 = r4941071 - r4941072;
        double r4941074 = exp(r4941073);
        double r4941075 = log(r4941074);
        double r4941076 = 0.5;
        double r4941077 = r4941068 * r4941068;
        double r4941078 = r4941076 * r4941077;
        double r4941079 = r4941078 + r4941068;
        double r4941080 = r4941070 ? r4941075 : r4941079;
        return r4941080;
}

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 r4941081, r4941082, r4941083, r4941084, r4941085, r4941086;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r4941081);
        mpfr_init(r4941082);
        mpfr_init(r4941083);
        mpfr_init(r4941084);
        mpfr_init_set_str(r4941085, "1", 10, MPFR_RNDN);
        mpfr_init(r4941086);
}

double f_im(double a, double x) {
        mpfr_set_d(r4941081, a, MPFR_RNDN);
        mpfr_set_d(r4941082, x, MPFR_RNDN);
        mpfr_mul(r4941083, r4941081, r4941082, MPFR_RNDN);
        mpfr_exp(r4941084, r4941083, MPFR_RNDN);
        ;
        mpfr_sub(r4941086, r4941084, r4941085, MPFR_RNDN);
        return mpfr_get_d(r4941086, MPFR_RNDN);
}

static mpfr_t r4941087, r4941088, r4941089, r4941090, r4941091, r4941092, r4941093, r4941094, r4941095, r4941096, r4941097, r4941098, r4941099, r4941100, r4941101;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r4941087);
        mpfr_init(r4941088);
        mpfr_init(r4941089);
        mpfr_init_set_str(r4941090, "-3.0996483699306456e-06", 10, MPFR_RNDN);
        mpfr_init(r4941091);
        mpfr_init(r4941092);
        mpfr_init_set_str(r4941093, "1", 10, MPFR_RNDN);
        mpfr_init(r4941094);
        mpfr_init(r4941095);
        mpfr_init(r4941096);
        mpfr_init_set_str(r4941097, "1/2", 10, MPFR_RNDN);
        mpfr_init(r4941098);
        mpfr_init(r4941099);
        mpfr_init(r4941100);
        mpfr_init(r4941101);
}

double f_fm(double a, double x) {
        mpfr_set_d(r4941087, a, MPFR_RNDN);
        mpfr_set_d(r4941088, x, MPFR_RNDN);
        mpfr_mul(r4941089, r4941087, r4941088, MPFR_RNDN);
        ;
        mpfr_set_si(r4941091, mpfr_cmp(r4941089, r4941090) <= 0, MPFR_RNDN);
        mpfr_exp(r4941092, r4941089, MPFR_RNDN);
        ;
        mpfr_sub(r4941094, r4941092, r4941093, MPFR_RNDN);
        mpfr_exp(r4941095, r4941094, MPFR_RNDN);
        mpfr_log(r4941096, r4941095, MPFR_RNDN);
        ;
        mpfr_sqr(r4941098, r4941089, MPFR_RNDN);
        mpfr_mul(r4941099, r4941097, r4941098, MPFR_RNDN);
        mpfr_add(r4941100, r4941099, r4941089, MPFR_RNDN);
        if (mpfr_get_si(r4941091, MPFR_RNDN)) { mpfr_set(r4941101, r4941096, MPFR_RNDN); } else { mpfr_set(r4941101, r4941100, MPFR_RNDN); };
        return mpfr_get_d(r4941101, MPFR_RNDN);
}

static mpfr_t r4941102, r4941103, r4941104, r4941105, r4941106, r4941107, r4941108, r4941109, r4941110, r4941111, r4941112, r4941113, r4941114, r4941115, r4941116;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r4941102);
        mpfr_init(r4941103);
        mpfr_init(r4941104);
        mpfr_init_set_str(r4941105, "-3.0996483699306456e-06", 10, MPFR_RNDN);
        mpfr_init(r4941106);
        mpfr_init(r4941107);
        mpfr_init_set_str(r4941108, "1", 10, MPFR_RNDN);
        mpfr_init(r4941109);
        mpfr_init(r4941110);
        mpfr_init(r4941111);
        mpfr_init_set_str(r4941112, "1/2", 10, MPFR_RNDN);
        mpfr_init(r4941113);
        mpfr_init(r4941114);
        mpfr_init(r4941115);
        mpfr_init(r4941116);
}

double f_dm(double a, double x) {
        mpfr_set_d(r4941102, a, MPFR_RNDN);
        mpfr_set_d(r4941103, x, MPFR_RNDN);
        mpfr_mul(r4941104, r4941102, r4941103, MPFR_RNDN);
        ;
        mpfr_set_si(r4941106, mpfr_cmp(r4941104, r4941105) <= 0, MPFR_RNDN);
        mpfr_exp(r4941107, r4941104, MPFR_RNDN);
        ;
        mpfr_sub(r4941109, r4941107, r4941108, MPFR_RNDN);
        mpfr_exp(r4941110, r4941109, MPFR_RNDN);
        mpfr_log(r4941111, r4941110, MPFR_RNDN);
        ;
        mpfr_sqr(r4941113, r4941104, MPFR_RNDN);
        mpfr_mul(r4941114, r4941112, r4941113, MPFR_RNDN);
        mpfr_add(r4941115, r4941114, r4941104, MPFR_RNDN);
        if (mpfr_get_si(r4941106, MPFR_RNDN)) { mpfr_set(r4941116, r4941111, MPFR_RNDN); } else { mpfr_set(r4941116, r4941115, MPFR_RNDN); };
        return mpfr_get_d(r4941116, MPFR_RNDN);
}

