#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 r4875814 = eps;
        float r4875815 = a;
        float r4875816 = b;
        float r4875817 = r4875815 + r4875816;
        float r4875818 = r4875817 * r4875814;
        float r4875819 = exp(r4875818);
        float r4875820 = 1.0f;
        float r4875821 = r4875819 - r4875820;
        float r4875822 = r4875814 * r4875821;
        float r4875823 = r4875815 * r4875814;
        float r4875824 = exp(r4875823);
        float r4875825 = r4875824 - r4875820;
        float r4875826 = r4875816 * r4875814;
        float r4875827 = exp(r4875826);
        float r4875828 = r4875827 - r4875820;
        float r4875829 = r4875825 * r4875828;
        float r4875830 = r4875822 / r4875829;
        return r4875830;
}

double f_id(double a, double b, double eps) {
        double r4875831 = eps;
        double r4875832 = a;
        double r4875833 = b;
        double r4875834 = r4875832 + r4875833;
        double r4875835 = r4875834 * r4875831;
        double r4875836 = exp(r4875835);
        double r4875837 = 1.0;
        double r4875838 = r4875836 - r4875837;
        double r4875839 = r4875831 * r4875838;
        double r4875840 = r4875832 * r4875831;
        double r4875841 = exp(r4875840);
        double r4875842 = r4875841 - r4875837;
        double r4875843 = r4875833 * r4875831;
        double r4875844 = exp(r4875843);
        double r4875845 = r4875844 - r4875837;
        double r4875846 = r4875842 * r4875845;
        double r4875847 = r4875839 / r4875846;
        return r4875847;
}


double f_of(float a, float b, float __attribute__((unused)) eps) {
        float r4875848 = 1.0f;
        float r4875849 = b;
        float r4875850 = r4875848 / r4875849;
        float r4875851 = a;
        float r4875852 = r4875848 / r4875851;
        float r4875853 = r4875850 + r4875852;
        return r4875853;
}

double f_od(double a, double b, double __attribute__((unused)) eps) {
        double r4875854 = 1.0;
        double r4875855 = b;
        double r4875856 = r4875854 / r4875855;
        double r4875857 = a;
        double r4875858 = r4875854 / r4875857;
        double r4875859 = r4875856 + r4875858;
        return r4875859;
}

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 r4875860, r4875861, r4875862, r4875863, r4875864, r4875865, r4875866, r4875867, r4875868, r4875869, r4875870, r4875871, r4875872, r4875873, r4875874, r4875875, r4875876;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r4875860);
        mpfr_init(r4875861);
        mpfr_init(r4875862);
        mpfr_init(r4875863);
        mpfr_init(r4875864);
        mpfr_init(r4875865);
        mpfr_init_set_str(r4875866, "1", 10, MPFR_RNDN);
        mpfr_init(r4875867);
        mpfr_init(r4875868);
        mpfr_init(r4875869);
        mpfr_init(r4875870);
        mpfr_init(r4875871);
        mpfr_init(r4875872);
        mpfr_init(r4875873);
        mpfr_init(r4875874);
        mpfr_init(r4875875);
        mpfr_init(r4875876);
}

double f_im(double a, double b, double eps) {
        mpfr_set_d(r4875860, eps, MPFR_RNDN);
        mpfr_set_d(r4875861, a, MPFR_RNDN);
        mpfr_set_d(r4875862, b, MPFR_RNDN);
        mpfr_add(r4875863, r4875861, r4875862, MPFR_RNDN);
        mpfr_mul(r4875864, r4875863, r4875860, MPFR_RNDN);
        mpfr_exp(r4875865, r4875864, MPFR_RNDN);
        ;
        mpfr_sub(r4875867, r4875865, r4875866, MPFR_RNDN);
        mpfr_mul(r4875868, r4875860, r4875867, MPFR_RNDN);
        mpfr_mul(r4875869, r4875861, r4875860, MPFR_RNDN);
        mpfr_exp(r4875870, r4875869, MPFR_RNDN);
        mpfr_sub(r4875871, r4875870, r4875866, MPFR_RNDN);
        mpfr_mul(r4875872, r4875862, r4875860, MPFR_RNDN);
        mpfr_exp(r4875873, r4875872, MPFR_RNDN);
        mpfr_sub(r4875874, r4875873, r4875866, MPFR_RNDN);
        mpfr_mul(r4875875, r4875871, r4875874, MPFR_RNDN);
        mpfr_div(r4875876, r4875868, r4875875, MPFR_RNDN);
        return mpfr_get_d(r4875876, MPFR_RNDN);
}

static mpfr_t r4875877, r4875878, r4875879, r4875880, r4875881, r4875882;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init_set_str(r4875877, "1", 10, MPFR_RNDN);
        mpfr_init(r4875878);
        mpfr_init(r4875879);
        mpfr_init(r4875880);
        mpfr_init(r4875881);
        mpfr_init(r4875882);
}

double f_fm(double a, double b, double __attribute__((unused)) eps) {
        ;
        mpfr_set_d(r4875878, b, MPFR_RNDN);
        mpfr_div(r4875879, r4875877, r4875878, MPFR_RNDN);
        mpfr_set_d(r4875880, a, MPFR_RNDN);
        mpfr_div(r4875881, r4875877, r4875880, MPFR_RNDN);
        mpfr_add(r4875882, r4875879, r4875881, MPFR_RNDN);
        return mpfr_get_d(r4875882, MPFR_RNDN);
}

static mpfr_t r4875883, r4875884, r4875885, r4875886, r4875887, r4875888;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init_set_str(r4875883, "1", 10, MPFR_RNDN);
        mpfr_init(r4875884);
        mpfr_init(r4875885);
        mpfr_init(r4875886);
        mpfr_init(r4875887);
        mpfr_init(r4875888);
}

double f_dm(double a, double b, double __attribute__((unused)) eps) {
        ;
        mpfr_set_d(r4875884, b, MPFR_RNDN);
        mpfr_div(r4875885, r4875883, r4875884, MPFR_RNDN);
        mpfr_set_d(r4875886, a, MPFR_RNDN);
        mpfr_div(r4875887, r4875883, r4875886, MPFR_RNDN);
        mpfr_add(r4875888, r4875885, r4875887, MPFR_RNDN);
        return mpfr_get_d(r4875888, MPFR_RNDN);
}

