#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 r4501895 = a;
        float r4501896 = x;
        float r4501897 = r4501895 * r4501896;
        float r4501898 = exp(r4501897);
        float r4501899 = 1.0f;
        float r4501900 = r4501898 - r4501899;
        return r4501900;
}

double f_id(double a, double x) {
        double r4501901 = a;
        double r4501902 = x;
        double r4501903 = r4501901 * r4501902;
        double r4501904 = exp(r4501903);
        double r4501905 = 1.0;
        double r4501906 = r4501904 - r4501905;
        return r4501906;
}


double f_of(float a, float x) {
        float r4501907 = a;
        float r4501908 = x;
        float r4501909 = r4501907 * r4501908;
        float r4501910 = -4.770999575039998e-09f;
        bool r4501911 = r4501909 <= r4501910;
        float r4501912 = exp(r4501909);
        float r4501913 = r4501912 * r4501912;
        float r4501914 = 1.0f;
        float r4501915 = r4501914 * r4501914;
        float r4501916 = r4501913 - r4501915;
        float r4501917 = r4501912 + r4501914;
        float r4501918 = r4501916 / r4501917;
        float r4501919 = 0.5f;
        float r4501920 = r4501909 * r4501909;
        float r4501921 = r4501919 * r4501920;
        float r4501922 = r4501908 * r4501907;
        float r4501923 = r4501921 + r4501922;
        float r4501924 = r4501911 ? r4501918 : r4501923;
        return r4501924;
}

double f_od(double a, double x) {
        double r4501925 = a;
        double r4501926 = x;
        double r4501927 = r4501925 * r4501926;
        double r4501928 = -4.770999575039998e-09;
        bool r4501929 = r4501927 <= r4501928;
        double r4501930 = exp(r4501927);
        double r4501931 = r4501930 * r4501930;
        double r4501932 = 1.0;
        double r4501933 = r4501932 * r4501932;
        double r4501934 = r4501931 - r4501933;
        double r4501935 = r4501930 + r4501932;
        double r4501936 = r4501934 / r4501935;
        double r4501937 = 0.5;
        double r4501938 = r4501927 * r4501927;
        double r4501939 = r4501937 * r4501938;
        double r4501940 = r4501926 * r4501925;
        double r4501941 = r4501939 + r4501940;
        double r4501942 = r4501929 ? r4501936 : r4501941;
        return r4501942;
}

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 r4501943, r4501944, r4501945, r4501946, r4501947, r4501948;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r4501943);
        mpfr_init(r4501944);
        mpfr_init(r4501945);
        mpfr_init(r4501946);
        mpfr_init_set_str(r4501947, "1", 10, MPFR_RNDN);
        mpfr_init(r4501948);
}

double f_im(double a, double x) {
        mpfr_set_d(r4501943, a, MPFR_RNDN);
        mpfr_set_d(r4501944, x, MPFR_RNDN);
        mpfr_mul(r4501945, r4501943, r4501944, MPFR_RNDN);
        mpfr_exp(r4501946, r4501945, MPFR_RNDN);
        ;
        mpfr_sub(r4501948, r4501946, r4501947, MPFR_RNDN);
        return mpfr_get_d(r4501948, MPFR_RNDN);
}

static mpfr_t r4501949, r4501950, r4501951, r4501952, r4501953, r4501954, r4501955, r4501956, r4501957, r4501958, r4501959, r4501960, r4501961, r4501962, r4501963, r4501964, r4501965, r4501966;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r4501949);
        mpfr_init(r4501950);
        mpfr_init(r4501951);
        mpfr_init_set_str(r4501952, "-4.770999575039998e-09", 10, MPFR_RNDN);
        mpfr_init(r4501953);
        mpfr_init(r4501954);
        mpfr_init(r4501955);
        mpfr_init_set_str(r4501956, "1", 10, MPFR_RNDN);
        mpfr_init(r4501957);
        mpfr_init(r4501958);
        mpfr_init(r4501959);
        mpfr_init(r4501960);
        mpfr_init_set_str(r4501961, "1/2", 10, MPFR_RNDN);
        mpfr_init(r4501962);
        mpfr_init(r4501963);
        mpfr_init(r4501964);
        mpfr_init(r4501965);
        mpfr_init(r4501966);
}

double f_fm(double a, double x) {
        mpfr_set_d(r4501949, a, MPFR_RNDN);
        mpfr_set_d(r4501950, x, MPFR_RNDN);
        mpfr_mul(r4501951, r4501949, r4501950, MPFR_RNDN);
        ;
        mpfr_set_si(r4501953, mpfr_cmp(r4501951, r4501952) <= 0, MPFR_RNDN);
        mpfr_exp(r4501954, r4501951, MPFR_RNDN);
        mpfr_sqr(r4501955, r4501954, MPFR_RNDN);
        ;
        mpfr_sqr(r4501957, r4501956, MPFR_RNDN);
        mpfr_sub(r4501958, r4501955, r4501957, MPFR_RNDN);
        mpfr_add(r4501959, r4501954, r4501956, MPFR_RNDN);
        mpfr_div(r4501960, r4501958, r4501959, MPFR_RNDN);
        ;
        mpfr_sqr(r4501962, r4501951, MPFR_RNDN);
        mpfr_mul(r4501963, r4501961, r4501962, MPFR_RNDN);
        mpfr_mul(r4501964, r4501950, r4501949, MPFR_RNDN);
        mpfr_add(r4501965, r4501963, r4501964, MPFR_RNDN);
        if (mpfr_get_si(r4501953, MPFR_RNDN)) { mpfr_set(r4501966, r4501960, MPFR_RNDN); } else { mpfr_set(r4501966, r4501965, MPFR_RNDN); };
        return mpfr_get_d(r4501966, MPFR_RNDN);
}

static mpfr_t r4501967, r4501968, r4501969, r4501970, r4501971, r4501972, r4501973, r4501974, r4501975, r4501976, r4501977, r4501978, r4501979, r4501980, r4501981, r4501982, r4501983, r4501984;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r4501967);
        mpfr_init(r4501968);
        mpfr_init(r4501969);
        mpfr_init_set_str(r4501970, "-4.770999575039998e-09", 10, MPFR_RNDN);
        mpfr_init(r4501971);
        mpfr_init(r4501972);
        mpfr_init(r4501973);
        mpfr_init_set_str(r4501974, "1", 10, MPFR_RNDN);
        mpfr_init(r4501975);
        mpfr_init(r4501976);
        mpfr_init(r4501977);
        mpfr_init(r4501978);
        mpfr_init_set_str(r4501979, "1/2", 10, MPFR_RNDN);
        mpfr_init(r4501980);
        mpfr_init(r4501981);
        mpfr_init(r4501982);
        mpfr_init(r4501983);
        mpfr_init(r4501984);
}

double f_dm(double a, double x) {
        mpfr_set_d(r4501967, a, MPFR_RNDN);
        mpfr_set_d(r4501968, x, MPFR_RNDN);
        mpfr_mul(r4501969, r4501967, r4501968, MPFR_RNDN);
        ;
        mpfr_set_si(r4501971, mpfr_cmp(r4501969, r4501970) <= 0, MPFR_RNDN);
        mpfr_exp(r4501972, r4501969, MPFR_RNDN);
        mpfr_sqr(r4501973, r4501972, MPFR_RNDN);
        ;
        mpfr_sqr(r4501975, r4501974, MPFR_RNDN);
        mpfr_sub(r4501976, r4501973, r4501975, MPFR_RNDN);
        mpfr_add(r4501977, r4501972, r4501974, MPFR_RNDN);
        mpfr_div(r4501978, r4501976, r4501977, MPFR_RNDN);
        ;
        mpfr_sqr(r4501980, r4501969, MPFR_RNDN);
        mpfr_mul(r4501981, r4501979, r4501980, MPFR_RNDN);
        mpfr_mul(r4501982, r4501968, r4501967, MPFR_RNDN);
        mpfr_add(r4501983, r4501981, r4501982, MPFR_RNDN);
        if (mpfr_get_si(r4501971, MPFR_RNDN)) { mpfr_set(r4501984, r4501978, MPFR_RNDN); } else { mpfr_set(r4501984, r4501983, MPFR_RNDN); };
        return mpfr_get_d(r4501984, MPFR_RNDN);
}

