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

char *name = "expq3 (problem 3.4.2)";

double f_if(float a, float b, float eps) {
        float r4417006 = eps;
        float r4417007 = a;
        float r4417008 = b;
        float r4417009 = r4417007 + r4417008;
        float r4417010 = r4417009 * r4417006;
        float r4417011 = exp(r4417010);
        float r4417012 = 1;
        float r4417013 = r4417011 - r4417012;
        float r4417014 = r4417006 * r4417013;
        float r4417015 = r4417007 * r4417006;
        float r4417016 = exp(r4417015);
        float r4417017 = r4417016 - r4417012;
        float r4417018 = r4417008 * r4417006;
        float r4417019 = exp(r4417018);
        float r4417020 = r4417019 - r4417012;
        float r4417021 = r4417017 * r4417020;
        float r4417022 = r4417014 / r4417021;
        return r4417022;
}

double f_id(double a, double b, double eps) {
        double r4417023 = eps;
        double r4417024 = a;
        double r4417025 = b;
        double r4417026 = r4417024 + r4417025;
        double r4417027 = r4417026 * r4417023;
        double r4417028 = exp(r4417027);
        double r4417029 = 1;
        double r4417030 = r4417028 - r4417029;
        double r4417031 = r4417023 * r4417030;
        double r4417032 = r4417024 * r4417023;
        double r4417033 = exp(r4417032);
        double r4417034 = r4417033 - r4417029;
        double r4417035 = r4417025 * r4417023;
        double r4417036 = exp(r4417035);
        double r4417037 = r4417036 - r4417029;
        double r4417038 = r4417034 * r4417037;
        double r4417039 = r4417031 / r4417038;
        return r4417039;
}


double f_of(float a, float b, float eps) {
        float r4417040 = a;
        float r4417041 = eps;
        float r4417042 = r4417040 * r4417041;
        float r4417043 = 4543654.312817573;
        bool r4417044 = r4417042 <= r4417043;
        float r4417045 = 1;
        float r4417046 = b;
        float r4417047 = r4417045 / r4417046;
        float r4417048 = r4417045 / r4417040;
        float r4417049 = r4417047 + r4417048;
        float r4417050 = r4417048 + r4417047;
        float r4417051 = 3;
        float r4417052 = pow(r4417050, r4417051);
        float r4417053 = cbrt(r4417052);
        float r4417054 = r4417044 ? r4417049 : r4417053;
        return r4417054;
}

double f_od(double a, double b, double eps) {
        double r4417055 = a;
        double r4417056 = eps;
        double r4417057 = r4417055 * r4417056;
        double r4417058 = 4543654.312817573;
        bool r4417059 = r4417057 <= r4417058;
        double r4417060 = 1;
        double r4417061 = b;
        double r4417062 = r4417060 / r4417061;
        double r4417063 = r4417060 / r4417055;
        double r4417064 = r4417062 + r4417063;
        double r4417065 = r4417063 + r4417062;
        double r4417066 = 3;
        double r4417067 = pow(r4417065, r4417066);
        double r4417068 = cbrt(r4417067);
        double r4417069 = r4417059 ? r4417064 : r4417068;
        return r4417069;
}

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 r4417070, r4417071, r4417072, r4417073, r4417074, r4417075, r4417076, r4417077, r4417078, r4417079, r4417080, r4417081, r4417082, r4417083, r4417084, r4417085, r4417086;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r4417070);
        mpfr_init(r4417071);
        mpfr_init(r4417072);
        mpfr_init(r4417073);
        mpfr_init(r4417074);
        mpfr_init(r4417075);
        mpfr_init_set_str(r4417076, "1", 10, MPFR_RNDN);
        mpfr_init(r4417077);
        mpfr_init(r4417078);
        mpfr_init(r4417079);
        mpfr_init(r4417080);
        mpfr_init(r4417081);
        mpfr_init(r4417082);
        mpfr_init(r4417083);
        mpfr_init(r4417084);
        mpfr_init(r4417085);
        mpfr_init(r4417086);
}

double f_im(double a, double b, double eps) {
        mpfr_set_d(r4417070, eps, MPFR_RNDN);
        mpfr_set_d(r4417071, a, MPFR_RNDN);
        mpfr_set_d(r4417072, b, MPFR_RNDN);
        mpfr_add(r4417073, r4417071, r4417072, MPFR_RNDN);
        mpfr_mul(r4417074, r4417073, r4417070, MPFR_RNDN);
        mpfr_exp(r4417075, r4417074, MPFR_RNDN);
        ;
        mpfr_sub(r4417077, r4417075, r4417076, MPFR_RNDN);
        mpfr_mul(r4417078, r4417070, r4417077, MPFR_RNDN);
        mpfr_mul(r4417079, r4417071, r4417070, MPFR_RNDN);
        mpfr_exp(r4417080, r4417079, MPFR_RNDN);
        mpfr_sub(r4417081, r4417080, r4417076, MPFR_RNDN);
        mpfr_mul(r4417082, r4417072, r4417070, MPFR_RNDN);
        mpfr_exp(r4417083, r4417082, MPFR_RNDN);
        mpfr_sub(r4417084, r4417083, r4417076, MPFR_RNDN);
        mpfr_mul(r4417085, r4417081, r4417084, MPFR_RNDN);
        mpfr_div(r4417086, r4417078, r4417085, MPFR_RNDN);
        return mpfr_get_d(r4417086, MPFR_RNDN);
}

static mpfr_t r4417087, r4417088, r4417089, r4417090, r4417091, r4417092, r4417093, r4417094, r4417095, r4417096, r4417097, r4417098, r4417099, r4417100, r4417101;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r4417087);
        mpfr_init(r4417088);
        mpfr_init(r4417089);
        mpfr_init_set_str(r4417090, "4543654.312817573", 10, MPFR_RNDN);
        mpfr_init(r4417091);
        mpfr_init_set_str(r4417092, "1", 10, MPFR_RNDN);
        mpfr_init(r4417093);
        mpfr_init(r4417094);
        mpfr_init(r4417095);
        mpfr_init(r4417096);
        mpfr_init(r4417097);
        mpfr_init_set_str(r4417098, "3", 10, MPFR_RNDN);
        mpfr_init(r4417099);
        mpfr_init(r4417100);
        mpfr_init(r4417101);
}

double f_fm(double a, double b, double eps) {
        mpfr_set_d(r4417087, a, MPFR_RNDN);
        mpfr_set_d(r4417088, eps, MPFR_RNDN);
        mpfr_mul(r4417089, r4417087, r4417088, MPFR_RNDN);
        ;
        mpfr_set_si(r4417091, mpfr_cmp(r4417089, r4417090) <= 0, MPFR_RNDN);
        ;
        mpfr_set_d(r4417093, b, MPFR_RNDN);
        mpfr_div(r4417094, r4417092, r4417093, MPFR_RNDN);
        mpfr_div(r4417095, r4417092, r4417087, MPFR_RNDN);
        mpfr_add(r4417096, r4417094, r4417095, MPFR_RNDN);
        mpfr_add(r4417097, r4417095, r4417094, MPFR_RNDN);
        ;
        mpfr_pow(r4417099, r4417097, r4417098, MPFR_RNDN);
        mpfr_cbrt(r4417100, r4417099, MPFR_RNDN);
        if (mpfr_get_si(r4417091, MPFR_RNDN)) { mpfr_set(r4417101, r4417096, MPFR_RNDN); } else { mpfr_set(r4417101, r4417100, MPFR_RNDN); };
        return mpfr_get_d(r4417101, MPFR_RNDN);
}

static mpfr_t r4417102, r4417103, r4417104, r4417105, r4417106, r4417107, r4417108, r4417109, r4417110, r4417111, r4417112, r4417113, r4417114, r4417115, r4417116;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r4417102);
        mpfr_init(r4417103);
        mpfr_init(r4417104);
        mpfr_init_set_str(r4417105, "4543654.312817573", 10, MPFR_RNDN);
        mpfr_init(r4417106);
        mpfr_init_set_str(r4417107, "1", 10, MPFR_RNDN);
        mpfr_init(r4417108);
        mpfr_init(r4417109);
        mpfr_init(r4417110);
        mpfr_init(r4417111);
        mpfr_init(r4417112);
        mpfr_init_set_str(r4417113, "3", 10, MPFR_RNDN);
        mpfr_init(r4417114);
        mpfr_init(r4417115);
        mpfr_init(r4417116);
}

double f_dm(double a, double b, double eps) {
        mpfr_set_d(r4417102, a, MPFR_RNDN);
        mpfr_set_d(r4417103, eps, MPFR_RNDN);
        mpfr_mul(r4417104, r4417102, r4417103, MPFR_RNDN);
        ;
        mpfr_set_si(r4417106, mpfr_cmp(r4417104, r4417105) <= 0, MPFR_RNDN);
        ;
        mpfr_set_d(r4417108, b, MPFR_RNDN);
        mpfr_div(r4417109, r4417107, r4417108, MPFR_RNDN);
        mpfr_div(r4417110, r4417107, r4417102, MPFR_RNDN);
        mpfr_add(r4417111, r4417109, r4417110, MPFR_RNDN);
        mpfr_add(r4417112, r4417110, r4417109, MPFR_RNDN);
        ;
        mpfr_pow(r4417114, r4417112, r4417113, MPFR_RNDN);
        mpfr_cbrt(r4417115, r4417114, MPFR_RNDN);
        if (mpfr_get_si(r4417106, MPFR_RNDN)) { mpfr_set(r4417116, r4417111, MPFR_RNDN); } else { mpfr_set(r4417116, r4417115, MPFR_RNDN); };
        return mpfr_get_d(r4417116, MPFR_RNDN);
}

