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

char *name = "NMSE example 3.7";

double f_if(float x) {
        float r27891 = x;
        float r27892 = exp(r27891);
        float r27893 = 1.0f;
        float r27894 = r27892 - r27893;
        return r27894;
}

double f_id(double x) {
        double r27895 = x;
        double r27896 = exp(r27895);
        double r27897 = 1.0;
        double r27898 = r27896 - r27897;
        return r27898;
}


double f_of(float x) {
        float r27899 = x;
        float r27900 = -6.667433711053936e-08f;
        bool r27901 = r27899 <= r27900;
        float r27902 = exp(r27899);
        float r27903 = 1.0f;
        float r27904 = r27902 - r27903;
        float r27905 = r27899 * r27899;
        float r27906 = 0.5f;
        float r27907 = r27905 * r27906;
        float r27908 = r27899 * (r27899 * r27899);
        float r27909 = 0.16666666666666666f;
        float r27910 = r27908 * r27909;
        float r27911 = r27910 + r27899;
        float r27912 = r27907 + r27911;
        float r27913 = r27901 ? r27904 : r27912;
        return r27913;
}

double f_od(double x) {
        double r27914 = x;
        double r27915 = -6.667433711053936e-08;
        bool r27916 = r27914 <= r27915;
        double r27917 = exp(r27914);
        double r27918 = 1.0;
        double r27919 = r27917 - r27918;
        double r27920 = r27914 * r27914;
        double r27921 = 0.5;
        double r27922 = r27920 * r27921;
        double r27923 = r27914 * (r27914 * r27914);
        double r27924 = 0.16666666666666666;
        double r27925 = r27923 * r27924;
        double r27926 = r27925 + r27914;
        double r27927 = r27922 + r27926;
        double r27928 = r27916 ? r27919 : r27927;
        return r27928;
}

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 r27929, r27930, r27931, r27932;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r27929);
        mpfr_init(r27930);
        mpfr_init_set_str(r27931, "1", 10, MPFR_RNDN);
        mpfr_init(r27932);
}

double f_im(double x) {
        mpfr_set_d(r27929, x, MPFR_RNDN);
        mpfr_exp(r27930, r27929, MPFR_RNDN);
        ;
        mpfr_sub(r27932, r27930, r27931, MPFR_RNDN);
        return mpfr_get_d(r27932, MPFR_RNDN);
}

static mpfr_t r27933, r27934, r27935, r27936, r27937, r27938, r27939, r27940, r27941, r27942, r27943, r27944, r27945, r27946, r27947;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r27933);
        mpfr_init_set_str(r27934, "-6.667433711053936e-08", 10, MPFR_RNDN);
        mpfr_init(r27935);
        mpfr_init(r27936);
        mpfr_init_set_str(r27937, "1", 10, MPFR_RNDN);
        mpfr_init(r27938);
        mpfr_init(r27939);
        mpfr_init_set_str(r27940, "1/2", 10, MPFR_RNDN);
        mpfr_init(r27941);
        mpfr_init(r27942);
        mpfr_init_set_str(r27943, "1/6", 10, MPFR_RNDN);
        mpfr_init(r27944);
        mpfr_init(r27945);
        mpfr_init(r27946);
        mpfr_init(r27947);
}

double f_fm(double x) {
        mpfr_set_d(r27933, x, MPFR_RNDN);
        ;
        mpfr_set_si(r27935, mpfr_cmp(r27933, r27934) <= 0, MPFR_RNDN);
        mpfr_exp(r27936, r27933, MPFR_RNDN);
        ;
        mpfr_sub(r27938, r27936, r27937, MPFR_RNDN);
        mpfr_sqr(r27939, r27933, MPFR_RNDN);
        ;
        mpfr_mul(r27941, r27939, r27940, MPFR_RNDN);
        mpfr_mul(r27942, r27933, r27933, MPFR_RNDN); mpfr_mul(r27942, r27942, r27933, MPFR_RNDN);
        ;
        mpfr_mul(r27944, r27942, r27943, MPFR_RNDN);
        mpfr_add(r27945, r27944, r27933, MPFR_RNDN);
        mpfr_add(r27946, r27941, r27945, MPFR_RNDN);
        if (mpfr_get_si(r27935, MPFR_RNDN)) { mpfr_set(r27947, r27938, MPFR_RNDN); } else { mpfr_set(r27947, r27946, MPFR_RNDN); };
        return mpfr_get_d(r27947, MPFR_RNDN);
}

static mpfr_t r27948, r27949, r27950, r27951, r27952, r27953, r27954, r27955, r27956, r27957, r27958, r27959, r27960, r27961, r27962;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r27948);
        mpfr_init_set_str(r27949, "-6.667433711053936e-08", 10, MPFR_RNDN);
        mpfr_init(r27950);
        mpfr_init(r27951);
        mpfr_init_set_str(r27952, "1", 10, MPFR_RNDN);
        mpfr_init(r27953);
        mpfr_init(r27954);
        mpfr_init_set_str(r27955, "1/2", 10, MPFR_RNDN);
        mpfr_init(r27956);
        mpfr_init(r27957);
        mpfr_init_set_str(r27958, "1/6", 10, MPFR_RNDN);
        mpfr_init(r27959);
        mpfr_init(r27960);
        mpfr_init(r27961);
        mpfr_init(r27962);
}

double f_dm(double x) {
        mpfr_set_d(r27948, x, MPFR_RNDN);
        ;
        mpfr_set_si(r27950, mpfr_cmp(r27948, r27949) <= 0, MPFR_RNDN);
        mpfr_exp(r27951, r27948, MPFR_RNDN);
        ;
        mpfr_sub(r27953, r27951, r27952, MPFR_RNDN);
        mpfr_sqr(r27954, r27948, MPFR_RNDN);
        ;
        mpfr_mul(r27956, r27954, r27955, MPFR_RNDN);
        mpfr_mul(r27957, r27948, r27948, MPFR_RNDN); mpfr_mul(r27957, r27957, r27948, MPFR_RNDN);
        ;
        mpfr_mul(r27959, r27957, r27958, MPFR_RNDN);
        mpfr_add(r27960, r27959, r27948, MPFR_RNDN);
        mpfr_add(r27961, r27956, r27960, MPFR_RNDN);
        if (mpfr_get_si(r27950, MPFR_RNDN)) { mpfr_set(r27962, r27953, MPFR_RNDN); } else { mpfr_set(r27962, r27961, MPFR_RNDN); };
        return mpfr_get_d(r27962, MPFR_RNDN);
}

