#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 r4940825 = eps;
        float r4940826 = a;
        float r4940827 = b;
        float r4940828 = r4940826 + r4940827;
        float r4940829 = r4940828 * r4940825;
        float r4940830 = exp(r4940829);
        float r4940831 = 1.0f;
        float r4940832 = r4940830 - r4940831;
        float r4940833 = r4940825 * r4940832;
        float r4940834 = r4940826 * r4940825;
        float r4940835 = exp(r4940834);
        float r4940836 = r4940835 - r4940831;
        float r4940837 = r4940827 * r4940825;
        float r4940838 = exp(r4940837);
        float r4940839 = r4940838 - r4940831;
        float r4940840 = r4940836 * r4940839;
        float r4940841 = r4940833 / r4940840;
        return r4940841;
}

double f_id(double a, double b, double eps) {
        double r4940842 = eps;
        double r4940843 = a;
        double r4940844 = b;
        double r4940845 = r4940843 + r4940844;
        double r4940846 = r4940845 * r4940842;
        double r4940847 = exp(r4940846);
        double r4940848 = 1.0;
        double r4940849 = r4940847 - r4940848;
        double r4940850 = r4940842 * r4940849;
        double r4940851 = r4940843 * r4940842;
        double r4940852 = exp(r4940851);
        double r4940853 = r4940852 - r4940848;
        double r4940854 = r4940844 * r4940842;
        double r4940855 = exp(r4940854);
        double r4940856 = r4940855 - r4940848;
        double r4940857 = r4940853 * r4940856;
        double r4940858 = r4940850 / r4940857;
        return r4940858;
}


double f_of(float a, float b, float __attribute__((unused)) eps) {
        float r4940859 = 1.0f;
        float r4940860 = a;
        float r4940861 = r4940859 / r4940860;
        float r4940862 = b;
        float r4940863 = r4940859 / r4940862;
        float r4940864 = r4940861 + r4940863;
        return r4940864;
}

double f_od(double a, double b, double __attribute__((unused)) eps) {
        double r4940865 = 1.0;
        double r4940866 = a;
        double r4940867 = r4940865 / r4940866;
        double r4940868 = b;
        double r4940869 = r4940865 / r4940868;
        double r4940870 = r4940867 + r4940869;
        return r4940870;
}

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 r4940871, r4940872, r4940873, r4940874, r4940875, r4940876, r4940877, r4940878, r4940879, r4940880, r4940881, r4940882, r4940883, r4940884, r4940885, r4940886, r4940887;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r4940871);
        mpfr_init(r4940872);
        mpfr_init(r4940873);
        mpfr_init(r4940874);
        mpfr_init(r4940875);
        mpfr_init(r4940876);
        mpfr_init_set_str(r4940877, "1", 10, MPFR_RNDN);
        mpfr_init(r4940878);
        mpfr_init(r4940879);
        mpfr_init(r4940880);
        mpfr_init(r4940881);
        mpfr_init(r4940882);
        mpfr_init(r4940883);
        mpfr_init(r4940884);
        mpfr_init(r4940885);
        mpfr_init(r4940886);
        mpfr_init(r4940887);
}

double f_im(double a, double b, double eps) {
        mpfr_set_d(r4940871, eps, MPFR_RNDN);
        mpfr_set_d(r4940872, a, MPFR_RNDN);
        mpfr_set_d(r4940873, b, MPFR_RNDN);
        mpfr_add(r4940874, r4940872, r4940873, MPFR_RNDN);
        mpfr_mul(r4940875, r4940874, r4940871, MPFR_RNDN);
        mpfr_exp(r4940876, r4940875, MPFR_RNDN);
        ;
        mpfr_sub(r4940878, r4940876, r4940877, MPFR_RNDN);
        mpfr_mul(r4940879, r4940871, r4940878, MPFR_RNDN);
        mpfr_mul(r4940880, r4940872, r4940871, MPFR_RNDN);
        mpfr_exp(r4940881, r4940880, MPFR_RNDN);
        mpfr_sub(r4940882, r4940881, r4940877, MPFR_RNDN);
        mpfr_mul(r4940883, r4940873, r4940871, MPFR_RNDN);
        mpfr_exp(r4940884, r4940883, MPFR_RNDN);
        mpfr_sub(r4940885, r4940884, r4940877, MPFR_RNDN);
        mpfr_mul(r4940886, r4940882, r4940885, MPFR_RNDN);
        mpfr_div(r4940887, r4940879, r4940886, MPFR_RNDN);
        return mpfr_get_d(r4940887, MPFR_RNDN);
}

static mpfr_t r4940888, r4940889, r4940890, r4940891, r4940892, r4940893;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init_set_str(r4940888, "1", 10, MPFR_RNDN);
        mpfr_init(r4940889);
        mpfr_init(r4940890);
        mpfr_init(r4940891);
        mpfr_init(r4940892);
        mpfr_init(r4940893);
}

double f_fm(double a, double b, double __attribute__((unused)) eps) {
        ;
        mpfr_set_d(r4940889, a, MPFR_RNDN);
        mpfr_div(r4940890, r4940888, r4940889, MPFR_RNDN);
        mpfr_set_d(r4940891, b, MPFR_RNDN);
        mpfr_div(r4940892, r4940888, r4940891, MPFR_RNDN);
        mpfr_add(r4940893, r4940890, r4940892, MPFR_RNDN);
        return mpfr_get_d(r4940893, MPFR_RNDN);
}

static mpfr_t r4940894, r4940895, r4940896, r4940897, r4940898, r4940899;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init_set_str(r4940894, "1", 10, MPFR_RNDN);
        mpfr_init(r4940895);
        mpfr_init(r4940896);
        mpfr_init(r4940897);
        mpfr_init(r4940898);
        mpfr_init(r4940899);
}

double f_dm(double a, double b, double __attribute__((unused)) eps) {
        ;
        mpfr_set_d(r4940895, a, MPFR_RNDN);
        mpfr_div(r4940896, r4940894, r4940895, MPFR_RNDN);
        mpfr_set_d(r4940897, b, MPFR_RNDN);
        mpfr_div(r4940898, r4940894, r4940897, MPFR_RNDN);
        mpfr_add(r4940899, r4940896, r4940898, MPFR_RNDN);
        return mpfr_get_d(r4940899, MPFR_RNDN);
}

