#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 r38862 = eps;
        float r38863 = a;
        float r38864 = b;
        float r38865 = r38863 + r38864;
        float r38866 = r38865 * r38862;
        float r38867 = exp(r38866);
        float r38868 = 1;
        float r38869 = r38867 - r38868;
        float r38870 = r38862 * r38869;
        float r38871 = r38863 * r38862;
        float r38872 = exp(r38871);
        float r38873 = r38872 - r38868;
        float r38874 = r38864 * r38862;
        float r38875 = exp(r38874);
        float r38876 = r38875 - r38868;
        float r38877 = r38873 * r38876;
        float r38878 = r38870 / r38877;
        return r38878;
}

double f_id(double a, double b, double eps) {
        double r38879 = eps;
        double r38880 = a;
        double r38881 = b;
        double r38882 = r38880 + r38881;
        double r38883 = r38882 * r38879;
        double r38884 = exp(r38883);
        double r38885 = 1;
        double r38886 = r38884 - r38885;
        double r38887 = r38879 * r38886;
        double r38888 = r38880 * r38879;
        double r38889 = exp(r38888);
        double r38890 = r38889 - r38885;
        double r38891 = r38881 * r38879;
        double r38892 = exp(r38891);
        double r38893 = r38892 - r38885;
        double r38894 = r38890 * r38893;
        double r38895 = r38887 / r38894;
        return r38895;
}


double f_of(float a, float b, float __attribute__((unused)) eps) {
        float r38896 = 1;
        float r38897 = b;
        float r38898 = r38896 / r38897;
        float r38899 = a;
        float r38900 = r38896 / r38899;
        float r38901 = r38898 + r38900;
        return r38901;
}

double f_od(double a, double b, double __attribute__((unused)) eps) {
        double r38902 = 1;
        double r38903 = b;
        double r38904 = r38902 / r38903;
        double r38905 = a;
        double r38906 = r38902 / r38905;
        double r38907 = r38904 + r38906;
        return r38907;
}

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 r38908, r38909, r38910, r38911, r38912, r38913, r38914, r38915, r38916, r38917, r38918, r38919, r38920, r38921, r38922, r38923, r38924;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r38908);
        mpfr_init(r38909);
        mpfr_init(r38910);
        mpfr_init(r38911);
        mpfr_init(r38912);
        mpfr_init(r38913);
        mpfr_init_set_str(r38914, "1", 10, MPFR_RNDN);
        mpfr_init(r38915);
        mpfr_init(r38916);
        mpfr_init(r38917);
        mpfr_init(r38918);
        mpfr_init(r38919);
        mpfr_init(r38920);
        mpfr_init(r38921);
        mpfr_init(r38922);
        mpfr_init(r38923);
        mpfr_init(r38924);
}

double f_im(double a, double b, double eps) {
        mpfr_set_d(r38908, eps, MPFR_RNDN);
        mpfr_set_d(r38909, a, MPFR_RNDN);
        mpfr_set_d(r38910, b, MPFR_RNDN);
        mpfr_add(r38911, r38909, r38910, MPFR_RNDN);
        mpfr_mul(r38912, r38911, r38908, MPFR_RNDN);
        mpfr_exp(r38913, r38912, MPFR_RNDN);
        ;
        mpfr_sub(r38915, r38913, r38914, MPFR_RNDN);
        mpfr_mul(r38916, r38908, r38915, MPFR_RNDN);
        mpfr_mul(r38917, r38909, r38908, MPFR_RNDN);
        mpfr_exp(r38918, r38917, MPFR_RNDN);
        mpfr_sub(r38919, r38918, r38914, MPFR_RNDN);
        mpfr_mul(r38920, r38910, r38908, MPFR_RNDN);
        mpfr_exp(r38921, r38920, MPFR_RNDN);
        mpfr_sub(r38922, r38921, r38914, MPFR_RNDN);
        mpfr_mul(r38923, r38919, r38922, MPFR_RNDN);
        mpfr_div(r38924, r38916, r38923, MPFR_RNDN);
        return mpfr_get_d(r38924, MPFR_RNDN);
}

static mpfr_t r38925, r38926, r38927, r38928, r38929, r38930;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init_set_str(r38925, "1", 10, MPFR_RNDN);
        mpfr_init(r38926);
        mpfr_init(r38927);
        mpfr_init(r38928);
        mpfr_init(r38929);
        mpfr_init(r38930);
}

double f_fm(double a, double b, double __attribute__((unused)) eps) {
        ;
        mpfr_set_d(r38926, b, MPFR_RNDN);
        mpfr_div(r38927, r38925, r38926, MPFR_RNDN);
        mpfr_set_d(r38928, a, MPFR_RNDN);
        mpfr_div(r38929, r38925, r38928, MPFR_RNDN);
        mpfr_add(r38930, r38927, r38929, MPFR_RNDN);
        return mpfr_get_d(r38930, MPFR_RNDN);
}

static mpfr_t r38931, r38932, r38933, r38934, r38935, r38936;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init_set_str(r38931, "1", 10, MPFR_RNDN);
        mpfr_init(r38932);
        mpfr_init(r38933);
        mpfr_init(r38934);
        mpfr_init(r38935);
        mpfr_init(r38936);
}

double f_dm(double a, double b, double __attribute__((unused)) eps) {
        ;
        mpfr_set_d(r38932, b, MPFR_RNDN);
        mpfr_div(r38933, r38931, r38932, MPFR_RNDN);
        mpfr_set_d(r38934, a, MPFR_RNDN);
        mpfr_div(r38935, r38931, r38934, MPFR_RNDN);
        mpfr_add(r38936, r38933, r38935, MPFR_RNDN);
        return mpfr_get_d(r38936, MPFR_RNDN);
}

