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

char *name = "NMSE section 3.5";

double f_if(float a, float x) {
        float r5319356 = a;
        float r5319357 = x;
        float r5319358 = r5319356 * r5319357;
        float r5319359 = exp(r5319358);
        float r5319360 = 1.0f;
        float r5319361 = r5319359 - r5319360;
        return r5319361;
}

double f_id(double a, double x) {
        double r5319362 = a;
        double r5319363 = x;
        double r5319364 = r5319362 * r5319363;
        double r5319365 = exp(r5319364);
        double r5319366 = 1.0;
        double r5319367 = r5319365 - r5319366;
        return r5319367;
}


double f_of(float a, float x) {
        float r5319368 = a;
        float r5319369 = x;
        float r5319370 = r5319368 * r5319369;
        float r5319371 = -4.1762420202878676e-24f;
        bool r5319372 = r5319370 <= r5319371;
        float r5319373 = exp(r5319370);
        float r5319374 = 1.0f;
        float r5319375 = r5319373 - r5319374;
        float r5319376 = r5319375 * (r5319375 * r5319375);
        float r5319377 = cbrt(r5319376);
        float r5319378 = r5319368 * (r5319368 * r5319368);
        float r5319379 = r5319369 * (r5319369 * r5319369);
        float r5319380 = r5319378 * r5319379;
        float r5319381 = 0.16666666666666666f;
        float r5319382 = r5319380 * r5319381;
        float r5319383 = r5319369 * r5319368;
        float r5319384 = r5319382 + r5319383;
        float r5319385 = 0.5f;
        float r5319386 = r5319383 * r5319383;
        float r5319387 = r5319385 * r5319386;
        float r5319388 = r5319384 + r5319387;
        float r5319389 = r5319372 ? r5319377 : r5319388;
        return r5319389;
}

double f_od(double a, double x) {
        double r5319390 = a;
        double r5319391 = x;
        double r5319392 = r5319390 * r5319391;
        double r5319393 = -4.1762420202878676e-24;
        bool r5319394 = r5319392 <= r5319393;
        double r5319395 = exp(r5319392);
        double r5319396 = 1.0;
        double r5319397 = r5319395 - r5319396;
        double r5319398 = r5319397 * (r5319397 * r5319397);
        double r5319399 = cbrt(r5319398);
        double r5319400 = r5319390 * (r5319390 * r5319390);
        double r5319401 = r5319391 * (r5319391 * r5319391);
        double r5319402 = r5319400 * r5319401;
        double r5319403 = 0.16666666666666666;
        double r5319404 = r5319402 * r5319403;
        double r5319405 = r5319391 * r5319390;
        double r5319406 = r5319404 + r5319405;
        double r5319407 = 0.5;
        double r5319408 = r5319405 * r5319405;
        double r5319409 = r5319407 * r5319408;
        double r5319410 = r5319406 + r5319409;
        double r5319411 = r5319394 ? r5319399 : r5319410;
        return r5319411;
}

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 r5319412, r5319413, r5319414, r5319415, r5319416, r5319417;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r5319412);
        mpfr_init(r5319413);
        mpfr_init(r5319414);
        mpfr_init(r5319415);
        mpfr_init_set_str(r5319416, "1", 10, MPFR_RNDN);
        mpfr_init(r5319417);
}

double f_im(double a, double x) {
        mpfr_set_d(r5319412, a, MPFR_RNDN);
        mpfr_set_d(r5319413, x, MPFR_RNDN);
        mpfr_mul(r5319414, r5319412, r5319413, MPFR_RNDN);
        mpfr_exp(r5319415, r5319414, MPFR_RNDN);
        ;
        mpfr_sub(r5319417, r5319415, r5319416, MPFR_RNDN);
        return mpfr_get_d(r5319417, MPFR_RNDN);
}

static mpfr_t r5319418, r5319419, r5319420, r5319421, r5319422, r5319423, r5319424, r5319425, r5319426, r5319427, r5319428, r5319429, r5319430, r5319431, r5319432, r5319433, r5319434, r5319435, r5319436, r5319437, r5319438, r5319439;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r5319418);
        mpfr_init(r5319419);
        mpfr_init(r5319420);
        mpfr_init_set_str(r5319421, "-4.1762420202878676e-24", 10, MPFR_RNDN);
        mpfr_init(r5319422);
        mpfr_init(r5319423);
        mpfr_init_set_str(r5319424, "1", 10, MPFR_RNDN);
        mpfr_init(r5319425);
        mpfr_init(r5319426);
        mpfr_init(r5319427);
        mpfr_init(r5319428);
        mpfr_init(r5319429);
        mpfr_init(r5319430);
        mpfr_init_set_str(r5319431, "1/6", 10, MPFR_RNDN);
        mpfr_init(r5319432);
        mpfr_init(r5319433);
        mpfr_init(r5319434);
        mpfr_init_set_str(r5319435, "1/2", 10, MPFR_RNDN);
        mpfr_init(r5319436);
        mpfr_init(r5319437);
        mpfr_init(r5319438);
        mpfr_init(r5319439);
}

double f_fm(double a, double x) {
        mpfr_set_d(r5319418, a, MPFR_RNDN);
        mpfr_set_d(r5319419, x, MPFR_RNDN);
        mpfr_mul(r5319420, r5319418, r5319419, MPFR_RNDN);
        ;
        mpfr_set_si(r5319422, mpfr_cmp(r5319420, r5319421) <= 0, MPFR_RNDN);
        mpfr_exp(r5319423, r5319420, MPFR_RNDN);
        ;
        mpfr_sub(r5319425, r5319423, r5319424, MPFR_RNDN);
        mpfr_mul(r5319426, r5319425, r5319425, MPFR_RNDN); mpfr_mul(r5319426, r5319426, r5319425, MPFR_RNDN);
        mpfr_cbrt(r5319427, r5319426, MPFR_RNDN);
        mpfr_mul(r5319428, r5319418, r5319418, MPFR_RNDN); mpfr_mul(r5319428, r5319428, r5319418, MPFR_RNDN);
        mpfr_mul(r5319429, r5319419, r5319419, MPFR_RNDN); mpfr_mul(r5319429, r5319429, r5319419, MPFR_RNDN);
        mpfr_mul(r5319430, r5319428, r5319429, MPFR_RNDN);
        ;
        mpfr_mul(r5319432, r5319430, r5319431, MPFR_RNDN);
        mpfr_mul(r5319433, r5319419, r5319418, MPFR_RNDN);
        mpfr_add(r5319434, r5319432, r5319433, MPFR_RNDN);
        ;
        mpfr_sqr(r5319436, r5319433, MPFR_RNDN);
        mpfr_mul(r5319437, r5319435, r5319436, MPFR_RNDN);
        mpfr_add(r5319438, r5319434, r5319437, MPFR_RNDN);
        if (mpfr_get_si(r5319422, MPFR_RNDN)) { mpfr_set(r5319439, r5319427, MPFR_RNDN); } else { mpfr_set(r5319439, r5319438, MPFR_RNDN); };
        return mpfr_get_d(r5319439, MPFR_RNDN);
}

static mpfr_t r5319440, r5319441, r5319442, r5319443, r5319444, r5319445, r5319446, r5319447, r5319448, r5319449, r5319450, r5319451, r5319452, r5319453, r5319454, r5319455, r5319456, r5319457, r5319458, r5319459, r5319460, r5319461;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r5319440);
        mpfr_init(r5319441);
        mpfr_init(r5319442);
        mpfr_init_set_str(r5319443, "-4.1762420202878676e-24", 10, MPFR_RNDN);
        mpfr_init(r5319444);
        mpfr_init(r5319445);
        mpfr_init_set_str(r5319446, "1", 10, MPFR_RNDN);
        mpfr_init(r5319447);
        mpfr_init(r5319448);
        mpfr_init(r5319449);
        mpfr_init(r5319450);
        mpfr_init(r5319451);
        mpfr_init(r5319452);
        mpfr_init_set_str(r5319453, "1/6", 10, MPFR_RNDN);
        mpfr_init(r5319454);
        mpfr_init(r5319455);
        mpfr_init(r5319456);
        mpfr_init_set_str(r5319457, "1/2", 10, MPFR_RNDN);
        mpfr_init(r5319458);
        mpfr_init(r5319459);
        mpfr_init(r5319460);
        mpfr_init(r5319461);
}

double f_dm(double a, double x) {
        mpfr_set_d(r5319440, a, MPFR_RNDN);
        mpfr_set_d(r5319441, x, MPFR_RNDN);
        mpfr_mul(r5319442, r5319440, r5319441, MPFR_RNDN);
        ;
        mpfr_set_si(r5319444, mpfr_cmp(r5319442, r5319443) <= 0, MPFR_RNDN);
        mpfr_exp(r5319445, r5319442, MPFR_RNDN);
        ;
        mpfr_sub(r5319447, r5319445, r5319446, MPFR_RNDN);
        mpfr_mul(r5319448, r5319447, r5319447, MPFR_RNDN); mpfr_mul(r5319448, r5319448, r5319447, MPFR_RNDN);
        mpfr_cbrt(r5319449, r5319448, MPFR_RNDN);
        mpfr_mul(r5319450, r5319440, r5319440, MPFR_RNDN); mpfr_mul(r5319450, r5319450, r5319440, MPFR_RNDN);
        mpfr_mul(r5319451, r5319441, r5319441, MPFR_RNDN); mpfr_mul(r5319451, r5319451, r5319441, MPFR_RNDN);
        mpfr_mul(r5319452, r5319450, r5319451, MPFR_RNDN);
        ;
        mpfr_mul(r5319454, r5319452, r5319453, MPFR_RNDN);
        mpfr_mul(r5319455, r5319441, r5319440, MPFR_RNDN);
        mpfr_add(r5319456, r5319454, r5319455, MPFR_RNDN);
        ;
        mpfr_sqr(r5319458, r5319455, MPFR_RNDN);
        mpfr_mul(r5319459, r5319457, r5319458, MPFR_RNDN);
        mpfr_add(r5319460, r5319456, r5319459, MPFR_RNDN);
        if (mpfr_get_si(r5319444, MPFR_RNDN)) { mpfr_set(r5319461, r5319449, MPFR_RNDN); } else { mpfr_set(r5319461, r5319460, MPFR_RNDN); };
        return mpfr_get_d(r5319461, MPFR_RNDN);
}

