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

char *name = "expq2 (section 3.11)";

double f_if(float x) {
        float r26948 = x;
        float r26949 = exp(r26948);
        float r26950 = 1;
        float r26951 = r26949 - r26950;
        float r26952 = r26949 / r26951;
        return r26952;
}

double f_id(double x) {
        double r26953 = x;
        double r26954 = exp(r26953);
        double r26955 = 1;
        double r26956 = r26954 - r26955;
        double r26957 = r26954 / r26956;
        return r26957;
}


double f_of(float x) {
        float r26958 = x;
        float r26959 = exp(r26958);
        float r26960 = 0.9925023520830203;
        bool r26961 = r26959 <= r26960;
        float r26962 = 1;
        float r26963 = r26959 - r26962;
        float r26964 = 3;
        float r26965 = pow(r26963, r26964);
        float r26966 = cbrt(r26965);
        float r26967 = r26959 / r26966;
        float r26968 = 1/2;
        float r26969 = r26962 / r26958;
        float r26970 = 1/12;
        float r26971 = r26970 * r26958;
        float r26972 = r26969 + r26971;
        float r26973 = r26968 + r26972;
        float r26974 = r26961 ? r26967 : r26973;
        return r26974;
}

double f_od(double x) {
        double r26975 = x;
        double r26976 = exp(r26975);
        double r26977 = 0.9925023520830203;
        bool r26978 = r26976 <= r26977;
        double r26979 = 1;
        double r26980 = r26976 - r26979;
        double r26981 = 3;
        double r26982 = pow(r26980, r26981);
        double r26983 = cbrt(r26982);
        double r26984 = r26976 / r26983;
        double r26985 = 1/2;
        double r26986 = r26979 / r26975;
        double r26987 = 1/12;
        double r26988 = r26987 * r26975;
        double r26989 = r26986 + r26988;
        double r26990 = r26985 + r26989;
        double r26991 = r26978 ? r26984 : r26990;
        return r26991;
}

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 r26992, r26993, r26994, r26995, r26996;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26992);
        mpfr_init(r26993);
        mpfr_init_set_str(r26994, "1", 10, MPFR_RNDN);
        mpfr_init(r26995);
        mpfr_init(r26996);
}

double f_im(double x) {
        mpfr_set_d(r26992, x, MPFR_RNDN);
        mpfr_exp(r26993, r26992, MPFR_RNDN);
        ;
        mpfr_sub(r26995, r26993, r26994, MPFR_RNDN);
        mpfr_div(r26996, r26993, r26995, MPFR_RNDN);
        return mpfr_get_d(r26996, MPFR_RNDN);
}

static mpfr_t r26997, r26998, r26999, r27000, r27001, r27002, r27003, r27004, r27005, r27006, r27007, r27008, r27009, r27010, r27011, r27012, r27013;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26997);
        mpfr_init(r26998);
        mpfr_init_set_str(r26999, "0.9925023520830203", 10, MPFR_RNDN);
        mpfr_init(r27000);
        mpfr_init_set_str(r27001, "1", 10, MPFR_RNDN);
        mpfr_init(r27002);
        mpfr_init_set_str(r27003, "3", 10, MPFR_RNDN);
        mpfr_init(r27004);
        mpfr_init(r27005);
        mpfr_init(r27006);
        mpfr_init_set_str(r27007, "1/2", 10, MPFR_RNDN);
        mpfr_init(r27008);
        mpfr_init_set_str(r27009, "1/12", 10, MPFR_RNDN);
        mpfr_init(r27010);
        mpfr_init(r27011);
        mpfr_init(r27012);
        mpfr_init(r27013);
}

double f_fm(double x) {
        mpfr_set_d(r26997, x, MPFR_RNDN);
        mpfr_exp(r26998, r26997, MPFR_RNDN);
        ;
        mpfr_set_si(r27000, mpfr_cmp(r26998, r26999) <= 0, MPFR_RNDN);
        ;
        mpfr_sub(r27002, r26998, r27001, MPFR_RNDN);
        ;
        mpfr_pow(r27004, r27002, r27003, MPFR_RNDN);
        mpfr_cbrt(r27005, r27004, MPFR_RNDN);
        mpfr_div(r27006, r26998, r27005, MPFR_RNDN);
        ;
        mpfr_div(r27008, r27001, r26997, MPFR_RNDN);
        ;
        mpfr_mul(r27010, r27009, r26997, MPFR_RNDN);
        mpfr_add(r27011, r27008, r27010, MPFR_RNDN);
        mpfr_add(r27012, r27007, r27011, MPFR_RNDN);
        if (mpfr_get_si(r27000, MPFR_RNDN)) { mpfr_set(r27013, r27006, MPFR_RNDN); } else { mpfr_set(r27013, r27012, MPFR_RNDN); };
        return mpfr_get_d(r27013, MPFR_RNDN);
}

static mpfr_t r27014, r27015, r27016, r27017, r27018, r27019, r27020, r27021, r27022, r27023, r27024, r27025, r27026, r27027, r27028, r27029, r27030;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r27014);
        mpfr_init(r27015);
        mpfr_init_set_str(r27016, "0.9925023520830203", 10, MPFR_RNDN);
        mpfr_init(r27017);
        mpfr_init_set_str(r27018, "1", 10, MPFR_RNDN);
        mpfr_init(r27019);
        mpfr_init_set_str(r27020, "3", 10, MPFR_RNDN);
        mpfr_init(r27021);
        mpfr_init(r27022);
        mpfr_init(r27023);
        mpfr_init_set_str(r27024, "1/2", 10, MPFR_RNDN);
        mpfr_init(r27025);
        mpfr_init_set_str(r27026, "1/12", 10, MPFR_RNDN);
        mpfr_init(r27027);
        mpfr_init(r27028);
        mpfr_init(r27029);
        mpfr_init(r27030);
}

double f_dm(double x) {
        mpfr_set_d(r27014, x, MPFR_RNDN);
        mpfr_exp(r27015, r27014, MPFR_RNDN);
        ;
        mpfr_set_si(r27017, mpfr_cmp(r27015, r27016) <= 0, MPFR_RNDN);
        ;
        mpfr_sub(r27019, r27015, r27018, MPFR_RNDN);
        ;
        mpfr_pow(r27021, r27019, r27020, MPFR_RNDN);
        mpfr_cbrt(r27022, r27021, MPFR_RNDN);
        mpfr_div(r27023, r27015, r27022, MPFR_RNDN);
        ;
        mpfr_div(r27025, r27018, r27014, MPFR_RNDN);
        ;
        mpfr_mul(r27027, r27026, r27014, MPFR_RNDN);
        mpfr_add(r27028, r27025, r27027, MPFR_RNDN);
        mpfr_add(r27029, r27024, r27028, MPFR_RNDN);
        if (mpfr_get_si(r27017, MPFR_RNDN)) { mpfr_set(r27030, r27023, MPFR_RNDN); } else { mpfr_set(r27030, r27029, MPFR_RNDN); };
        return mpfr_get_d(r27030, MPFR_RNDN);
}

