#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 r26975 = eps;
        float r26976 = a;
        float r26977 = b;
        float r26978 = r26976 + r26977;
        float r26979 = r26978 * r26975;
        float r26980 = exp(r26979);
        float r26981 = 1;
        float r26982 = r26980 - r26981;
        float r26983 = r26975 * r26982;
        float r26984 = r26976 * r26975;
        float r26985 = exp(r26984);
        float r26986 = r26985 - r26981;
        float r26987 = r26977 * r26975;
        float r26988 = exp(r26987);
        float r26989 = r26988 - r26981;
        float r26990 = r26986 * r26989;
        float r26991 = r26983 / r26990;
        return r26991;
}

double f_id(double a, double b, double eps) {
        double r26992 = eps;
        double r26993 = a;
        double r26994 = b;
        double r26995 = r26993 + r26994;
        double r26996 = r26995 * r26992;
        double r26997 = exp(r26996);
        double r26998 = 1;
        double r26999 = r26997 - r26998;
        double r27000 = r26992 * r26999;
        double r27001 = r26993 * r26992;
        double r27002 = exp(r27001);
        double r27003 = r27002 - r26998;
        double r27004 = r26994 * r26992;
        double r27005 = exp(r27004);
        double r27006 = r27005 - r26998;
        double r27007 = r27003 * r27006;
        double r27008 = r27000 / r27007;
        return r27008;
}


double f_of(float a, float b, float eps) {
        float r27009 = eps;
        float r27010 = a;
        float r27011 = b;
        float r27012 = r27010 + r27011;
        float r27013 = r27012 * r27009;
        float r27014 = exp(r27013);
        float r27015 = 1;
        float r27016 = r27014 - r27015;
        float r27017 = r27009 * r27016;
        float r27018 = r27010 * r27009;
        float r27019 = exp(r27018);
        float r27020 = r27019 - r27015;
        float r27021 = r27011 * r27009;
        float r27022 = exp(r27021);
        float r27023 = r27022 - r27015;
        float r27024 = r27020 * r27023;
        float r27025 = r27017 / r27024;
        float r27026 = -2.4506094467107194e-35;
        bool r27027 = r27025 <= r27026;
        float r27028 = r27015 / r27011;
        float r27029 = r27015 / r27010;
        float r27030 = r27028 + r27029;
        float r27031 = 1.7828005127090343e+308;
        bool r27032 = r27025 <= r27031;
        float r27033 = exp(r27020);
        float r27034 = log(r27033);
        float r27035 = r27034 * r27023;
        float r27036 = r27017 / r27035;
        float r27037 = r27032 ? r27036 : r27030;
        float r27038 = r27027 ? r27030 : r27037;
        return r27038;
}

double f_od(double a, double b, double eps) {
        double r27039 = eps;
        double r27040 = a;
        double r27041 = b;
        double r27042 = r27040 + r27041;
        double r27043 = r27042 * r27039;
        double r27044 = exp(r27043);
        double r27045 = 1;
        double r27046 = r27044 - r27045;
        double r27047 = r27039 * r27046;
        double r27048 = r27040 * r27039;
        double r27049 = exp(r27048);
        double r27050 = r27049 - r27045;
        double r27051 = r27041 * r27039;
        double r27052 = exp(r27051);
        double r27053 = r27052 - r27045;
        double r27054 = r27050 * r27053;
        double r27055 = r27047 / r27054;
        double r27056 = -2.4506094467107194e-35;
        bool r27057 = r27055 <= r27056;
        double r27058 = r27045 / r27041;
        double r27059 = r27045 / r27040;
        double r27060 = r27058 + r27059;
        double r27061 = 1.7828005127090343e+308;
        bool r27062 = r27055 <= r27061;
        double r27063 = exp(r27050);
        double r27064 = log(r27063);
        double r27065 = r27064 * r27053;
        double r27066 = r27047 / r27065;
        double r27067 = r27062 ? r27066 : r27060;
        double r27068 = r27057 ? r27060 : r27067;
        return r27068;
}

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 r27069, r27070, r27071, r27072, r27073, r27074, r27075, r27076, r27077, r27078, r27079, r27080, r27081, r27082, r27083, r27084, r27085;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2384);
        mpfr_init(r27069);
        mpfr_init(r27070);
        mpfr_init(r27071);
        mpfr_init(r27072);
        mpfr_init(r27073);
        mpfr_init(r27074);
        mpfr_init_set_str(r27075, "1", 10, MPFR_RNDN);
        mpfr_init(r27076);
        mpfr_init(r27077);
        mpfr_init(r27078);
        mpfr_init(r27079);
        mpfr_init(r27080);
        mpfr_init(r27081);
        mpfr_init(r27082);
        mpfr_init(r27083);
        mpfr_init(r27084);
        mpfr_init(r27085);
}

double f_im(double a, double b, double eps) {
        mpfr_set_d(r27069, eps, MPFR_RNDN);
        mpfr_set_d(r27070, a, MPFR_RNDN);
        mpfr_set_d(r27071, b, MPFR_RNDN);
        mpfr_add(r27072, r27070, r27071, MPFR_RNDN);
        mpfr_mul(r27073, r27072, r27069, MPFR_RNDN);
        mpfr_exp(r27074, r27073, MPFR_RNDN);
        ;
        mpfr_sub(r27076, r27074, r27075, MPFR_RNDN);
        mpfr_mul(r27077, r27069, r27076, MPFR_RNDN);
        mpfr_mul(r27078, r27070, r27069, MPFR_RNDN);
        mpfr_exp(r27079, r27078, MPFR_RNDN);
        mpfr_sub(r27080, r27079, r27075, MPFR_RNDN);
        mpfr_mul(r27081, r27071, r27069, MPFR_RNDN);
        mpfr_exp(r27082, r27081, MPFR_RNDN);
        mpfr_sub(r27083, r27082, r27075, MPFR_RNDN);
        mpfr_mul(r27084, r27080, r27083, MPFR_RNDN);
        mpfr_div(r27085, r27077, r27084, MPFR_RNDN);
        return mpfr_get_d(r27085, MPFR_RNDN);
}

static mpfr_t r27086, r27087, r27088, r27089, r27090, r27091, r27092, r27093, r27094, r27095, r27096, r27097, r27098, r27099, r27100, r27101, r27102, r27103, r27104, r27105, r27106, r27107, r27108, r27109, r27110, r27111, r27112, r27113, r27114, r27115;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r27086);
        mpfr_init(r27087);
        mpfr_init(r27088);
        mpfr_init(r27089);
        mpfr_init(r27090);
        mpfr_init(r27091);
        mpfr_init_set_str(r27092, "1", 10, MPFR_RNDN);
        mpfr_init(r27093);
        mpfr_init(r27094);
        mpfr_init(r27095);
        mpfr_init(r27096);
        mpfr_init(r27097);
        mpfr_init(r27098);
        mpfr_init(r27099);
        mpfr_init(r27100);
        mpfr_init(r27101);
        mpfr_init(r27102);
        mpfr_init_set_str(r27103, "-2.4506094467107194e-35", 10, MPFR_RNDN);
        mpfr_init(r27104);
        mpfr_init(r27105);
        mpfr_init(r27106);
        mpfr_init(r27107);
        mpfr_init_set_str(r27108, "1.7828005127090343e+308", 10, MPFR_RNDN);
        mpfr_init(r27109);
        mpfr_init(r27110);
        mpfr_init(r27111);
        mpfr_init(r27112);
        mpfr_init(r27113);
        mpfr_init(r27114);
        mpfr_init(r27115);
}

double f_fm(double a, double b, double eps) {
        mpfr_set_d(r27086, eps, MPFR_RNDN);
        mpfr_set_d(r27087, a, MPFR_RNDN);
        mpfr_set_d(r27088, b, MPFR_RNDN);
        mpfr_add(r27089, r27087, r27088, MPFR_RNDN);
        mpfr_mul(r27090, r27089, r27086, MPFR_RNDN);
        mpfr_exp(r27091, r27090, MPFR_RNDN);
        ;
        mpfr_sub(r27093, r27091, r27092, MPFR_RNDN);
        mpfr_mul(r27094, r27086, r27093, MPFR_RNDN);
        mpfr_mul(r27095, r27087, r27086, MPFR_RNDN);
        mpfr_exp(r27096, r27095, MPFR_RNDN);
        mpfr_sub(r27097, r27096, r27092, MPFR_RNDN);
        mpfr_mul(r27098, r27088, r27086, MPFR_RNDN);
        mpfr_exp(r27099, r27098, MPFR_RNDN);
        mpfr_sub(r27100, r27099, r27092, MPFR_RNDN);
        mpfr_mul(r27101, r27097, r27100, MPFR_RNDN);
        mpfr_div(r27102, r27094, r27101, MPFR_RNDN);
        ;
        mpfr_set_si(r27104, mpfr_cmp(r27102, r27103) <= 0, MPFR_RNDN);
        mpfr_div(r27105, r27092, r27088, MPFR_RNDN);
        mpfr_div(r27106, r27092, r27087, MPFR_RNDN);
        mpfr_add(r27107, r27105, r27106, MPFR_RNDN);
        ;
        mpfr_set_si(r27109, mpfr_cmp(r27102, r27108) <= 0, MPFR_RNDN);
        mpfr_exp(r27110, r27097, MPFR_RNDN);
        mpfr_log(r27111, r27110, MPFR_RNDN);
        mpfr_mul(r27112, r27111, r27100, MPFR_RNDN);
        mpfr_div(r27113, r27094, r27112, MPFR_RNDN);
        if (mpfr_get_si(r27109, MPFR_RNDN)) { mpfr_set(r27114, r27113, MPFR_RNDN); } else { mpfr_set(r27114, r27107, MPFR_RNDN); };
        if (mpfr_get_si(r27104, MPFR_RNDN)) { mpfr_set(r27115, r27107, MPFR_RNDN); } else { mpfr_set(r27115, r27114, MPFR_RNDN); };
        return mpfr_get_d(r27115, MPFR_RNDN);
}

static mpfr_t r27116, r27117, r27118, r27119, r27120, r27121, r27122, r27123, r27124, r27125, r27126, r27127, r27128, r27129, r27130, r27131, r27132, r27133, r27134, r27135, r27136, r27137, r27138, r27139, r27140, r27141, r27142, r27143, r27144, r27145;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r27116);
        mpfr_init(r27117);
        mpfr_init(r27118);
        mpfr_init(r27119);
        mpfr_init(r27120);
        mpfr_init(r27121);
        mpfr_init_set_str(r27122, "1", 10, MPFR_RNDN);
        mpfr_init(r27123);
        mpfr_init(r27124);
        mpfr_init(r27125);
        mpfr_init(r27126);
        mpfr_init(r27127);
        mpfr_init(r27128);
        mpfr_init(r27129);
        mpfr_init(r27130);
        mpfr_init(r27131);
        mpfr_init(r27132);
        mpfr_init_set_str(r27133, "-2.4506094467107194e-35", 10, MPFR_RNDN);
        mpfr_init(r27134);
        mpfr_init(r27135);
        mpfr_init(r27136);
        mpfr_init(r27137);
        mpfr_init_set_str(r27138, "1.7828005127090343e+308", 10, MPFR_RNDN);
        mpfr_init(r27139);
        mpfr_init(r27140);
        mpfr_init(r27141);
        mpfr_init(r27142);
        mpfr_init(r27143);
        mpfr_init(r27144);
        mpfr_init(r27145);
}

double f_dm(double a, double b, double eps) {
        mpfr_set_d(r27116, eps, MPFR_RNDN);
        mpfr_set_d(r27117, a, MPFR_RNDN);
        mpfr_set_d(r27118, b, MPFR_RNDN);
        mpfr_add(r27119, r27117, r27118, MPFR_RNDN);
        mpfr_mul(r27120, r27119, r27116, MPFR_RNDN);
        mpfr_exp(r27121, r27120, MPFR_RNDN);
        ;
        mpfr_sub(r27123, r27121, r27122, MPFR_RNDN);
        mpfr_mul(r27124, r27116, r27123, MPFR_RNDN);
        mpfr_mul(r27125, r27117, r27116, MPFR_RNDN);
        mpfr_exp(r27126, r27125, MPFR_RNDN);
        mpfr_sub(r27127, r27126, r27122, MPFR_RNDN);
        mpfr_mul(r27128, r27118, r27116, MPFR_RNDN);
        mpfr_exp(r27129, r27128, MPFR_RNDN);
        mpfr_sub(r27130, r27129, r27122, MPFR_RNDN);
        mpfr_mul(r27131, r27127, r27130, MPFR_RNDN);
        mpfr_div(r27132, r27124, r27131, MPFR_RNDN);
        ;
        mpfr_set_si(r27134, mpfr_cmp(r27132, r27133) <= 0, MPFR_RNDN);
        mpfr_div(r27135, r27122, r27118, MPFR_RNDN);
        mpfr_div(r27136, r27122, r27117, MPFR_RNDN);
        mpfr_add(r27137, r27135, r27136, MPFR_RNDN);
        ;
        mpfr_set_si(r27139, mpfr_cmp(r27132, r27138) <= 0, MPFR_RNDN);
        mpfr_exp(r27140, r27127, MPFR_RNDN);
        mpfr_log(r27141, r27140, MPFR_RNDN);
        mpfr_mul(r27142, r27141, r27130, MPFR_RNDN);
        mpfr_div(r27143, r27124, r27142, MPFR_RNDN);
        if (mpfr_get_si(r27139, MPFR_RNDN)) { mpfr_set(r27144, r27143, MPFR_RNDN); } else { mpfr_set(r27144, r27137, MPFR_RNDN); };
        if (mpfr_get_si(r27134, MPFR_RNDN)) { mpfr_set(r27145, r27137, MPFR_RNDN); } else { mpfr_set(r27145, r27144, MPFR_RNDN); };
        return mpfr_get_d(r27145, MPFR_RNDN);
}

