#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 r5181904 = a;
        float r5181905 = x;
        float r5181906 = r5181904 * r5181905;
        float r5181907 = exp(r5181906);
        float r5181908 = 1.0f;
        float r5181909 = r5181907 - r5181908;
        return r5181909;
}

double f_id(double a, double x) {
        double r5181910 = a;
        double r5181911 = x;
        double r5181912 = r5181910 * r5181911;
        double r5181913 = exp(r5181912);
        double r5181914 = 1.0;
        double r5181915 = r5181913 - r5181914;
        return r5181915;
}


double f_of(float a, float x) {
        float r5181916 = a;
        float r5181917 = x;
        float r5181918 = r5181916 * r5181917;
        float r5181919 = -9.689533085427536e-06f;
        bool r5181920 = r5181918 <= r5181919;
        float r5181921 = exp(r5181918);
        float r5181922 = 1.0f;
        float r5181923 = r5181921 - r5181922;
        float r5181924 = r5181923 * (r5181923 * r5181923);
        float r5181925 = cbrt(r5181924);
        float r5181926 = 0.5f;
        float r5181927 = 0.16666666666666666f;
        float r5181928 = r5181917 * r5181927;
        float r5181929 = r5181916 * r5181928;
        float r5181930 = r5181926 + r5181929;
        float r5181931 = r5181918 * r5181918;
        float r5181932 = r5181930 * r5181931;
        float r5181933 = r5181917 * r5181916;
        float r5181934 = r5181932 + r5181933;
        float r5181935 = r5181920 ? r5181925 : r5181934;
        return r5181935;
}

double f_od(double a, double x) {
        double r5181936 = a;
        double r5181937 = x;
        double r5181938 = r5181936 * r5181937;
        double r5181939 = -9.689533085427536e-06;
        bool r5181940 = r5181938 <= r5181939;
        double r5181941 = exp(r5181938);
        double r5181942 = 1.0;
        double r5181943 = r5181941 - r5181942;
        double r5181944 = r5181943 * (r5181943 * r5181943);
        double r5181945 = cbrt(r5181944);
        double r5181946 = 0.5;
        double r5181947 = 0.16666666666666666;
        double r5181948 = r5181937 * r5181947;
        double r5181949 = r5181936 * r5181948;
        double r5181950 = r5181946 + r5181949;
        double r5181951 = r5181938 * r5181938;
        double r5181952 = r5181950 * r5181951;
        double r5181953 = r5181937 * r5181936;
        double r5181954 = r5181952 + r5181953;
        double r5181955 = r5181940 ? r5181945 : r5181954;
        return r5181955;
}

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 r5181956, r5181957, r5181958, r5181959, r5181960, r5181961;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r5181956);
        mpfr_init(r5181957);
        mpfr_init(r5181958);
        mpfr_init(r5181959);
        mpfr_init_set_str(r5181960, "1", 10, MPFR_RNDN);
        mpfr_init(r5181961);
}

double f_im(double a, double x) {
        mpfr_set_d(r5181956, a, MPFR_RNDN);
        mpfr_set_d(r5181957, x, MPFR_RNDN);
        mpfr_mul(r5181958, r5181956, r5181957, MPFR_RNDN);
        mpfr_exp(r5181959, r5181958, MPFR_RNDN);
        ;
        mpfr_sub(r5181961, r5181959, r5181960, MPFR_RNDN);
        return mpfr_get_d(r5181961, MPFR_RNDN);
}

static mpfr_t r5181962, r5181963, r5181964, r5181965, r5181966, r5181967, r5181968, r5181969, r5181970, r5181971, r5181972, r5181973, r5181974, r5181975, r5181976, r5181977, r5181978, r5181979, r5181980, r5181981;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r5181962);
        mpfr_init(r5181963);
        mpfr_init(r5181964);
        mpfr_init_set_str(r5181965, "-9.689533085427536e-06", 10, MPFR_RNDN);
        mpfr_init(r5181966);
        mpfr_init(r5181967);
        mpfr_init_set_str(r5181968, "1", 10, MPFR_RNDN);
        mpfr_init(r5181969);
        mpfr_init(r5181970);
        mpfr_init(r5181971);
        mpfr_init_set_str(r5181972, "1/2", 10, MPFR_RNDN);
        mpfr_init_set_str(r5181973, "1/6", 10, MPFR_RNDN);
        mpfr_init(r5181974);
        mpfr_init(r5181975);
        mpfr_init(r5181976);
        mpfr_init(r5181977);
        mpfr_init(r5181978);
        mpfr_init(r5181979);
        mpfr_init(r5181980);
        mpfr_init(r5181981);
}

double f_fm(double a, double x) {
        mpfr_set_d(r5181962, a, MPFR_RNDN);
        mpfr_set_d(r5181963, x, MPFR_RNDN);
        mpfr_mul(r5181964, r5181962, r5181963, MPFR_RNDN);
        ;
        mpfr_set_si(r5181966, mpfr_cmp(r5181964, r5181965) <= 0, MPFR_RNDN);
        mpfr_exp(r5181967, r5181964, MPFR_RNDN);
        ;
        mpfr_sub(r5181969, r5181967, r5181968, MPFR_RNDN);
        mpfr_mul(r5181970, r5181969, r5181969, MPFR_RNDN); mpfr_mul(r5181970, r5181970, r5181969, MPFR_RNDN);
        mpfr_cbrt(r5181971, r5181970, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r5181974, r5181963, r5181973, MPFR_RNDN);
        mpfr_mul(r5181975, r5181962, r5181974, MPFR_RNDN);
        mpfr_add(r5181976, r5181972, r5181975, MPFR_RNDN);
        mpfr_sqr(r5181977, r5181964, MPFR_RNDN);
        mpfr_mul(r5181978, r5181976, r5181977, MPFR_RNDN);
        mpfr_mul(r5181979, r5181963, r5181962, MPFR_RNDN);
        mpfr_add(r5181980, r5181978, r5181979, MPFR_RNDN);
        if (mpfr_get_si(r5181966, MPFR_RNDN)) { mpfr_set(r5181981, r5181971, MPFR_RNDN); } else { mpfr_set(r5181981, r5181980, MPFR_RNDN); };
        return mpfr_get_d(r5181981, MPFR_RNDN);
}

static mpfr_t r5181982, r5181983, r5181984, r5181985, r5181986, r5181987, r5181988, r5181989, r5181990, r5181991, r5181992, r5181993, r5181994, r5181995, r5181996, r5181997, r5181998, r5181999, r5182000, r5182001;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r5181982);
        mpfr_init(r5181983);
        mpfr_init(r5181984);
        mpfr_init_set_str(r5181985, "-9.689533085427536e-06", 10, MPFR_RNDN);
        mpfr_init(r5181986);
        mpfr_init(r5181987);
        mpfr_init_set_str(r5181988, "1", 10, MPFR_RNDN);
        mpfr_init(r5181989);
        mpfr_init(r5181990);
        mpfr_init(r5181991);
        mpfr_init_set_str(r5181992, "1/2", 10, MPFR_RNDN);
        mpfr_init_set_str(r5181993, "1/6", 10, MPFR_RNDN);
        mpfr_init(r5181994);
        mpfr_init(r5181995);
        mpfr_init(r5181996);
        mpfr_init(r5181997);
        mpfr_init(r5181998);
        mpfr_init(r5181999);
        mpfr_init(r5182000);
        mpfr_init(r5182001);
}

double f_dm(double a, double x) {
        mpfr_set_d(r5181982, a, MPFR_RNDN);
        mpfr_set_d(r5181983, x, MPFR_RNDN);
        mpfr_mul(r5181984, r5181982, r5181983, MPFR_RNDN);
        ;
        mpfr_set_si(r5181986, mpfr_cmp(r5181984, r5181985) <= 0, MPFR_RNDN);
        mpfr_exp(r5181987, r5181984, MPFR_RNDN);
        ;
        mpfr_sub(r5181989, r5181987, r5181988, MPFR_RNDN);
        mpfr_mul(r5181990, r5181989, r5181989, MPFR_RNDN); mpfr_mul(r5181990, r5181990, r5181989, MPFR_RNDN);
        mpfr_cbrt(r5181991, r5181990, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r5181994, r5181983, r5181993, MPFR_RNDN);
        mpfr_mul(r5181995, r5181982, r5181994, MPFR_RNDN);
        mpfr_add(r5181996, r5181992, r5181995, MPFR_RNDN);
        mpfr_sqr(r5181997, r5181984, MPFR_RNDN);
        mpfr_mul(r5181998, r5181996, r5181997, MPFR_RNDN);
        mpfr_mul(r5181999, r5181983, r5181982, MPFR_RNDN);
        mpfr_add(r5182000, r5181998, r5181999, MPFR_RNDN);
        if (mpfr_get_si(r5181986, MPFR_RNDN)) { mpfr_set(r5182001, r5181991, MPFR_RNDN); } else { mpfr_set(r5182001, r5182000, MPFR_RNDN); };
        return mpfr_get_d(r5182001, MPFR_RNDN);
}

