#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 r5040356 = a;
        float r5040357 = x;
        float r5040358 = r5040356 * r5040357;
        float r5040359 = exp(r5040358);
        float r5040360 = 1.0f;
        float r5040361 = r5040359 - r5040360;
        return r5040361;
}

double f_id(double a, double x) {
        double r5040362 = a;
        double r5040363 = x;
        double r5040364 = r5040362 * r5040363;
        double r5040365 = exp(r5040364);
        double r5040366 = 1.0;
        double r5040367 = r5040365 - r5040366;
        return r5040367;
}


double f_of(float a, float x) {
        float r5040368 = a;
        float r5040369 = x;
        float r5040370 = r5040368 * r5040369;
        float r5040371 = -3.4442505479166693e-07f;
        bool r5040372 = r5040370 <= r5040371;
        float r5040373 = exp(r5040370);
        float r5040374 = sqrt(r5040373);
        float r5040375 = 1.0f;
        float r5040376 = r5040374 + r5040375;
        float r5040377 = r5040374 - r5040375;
        float r5040378 = r5040376 * r5040377;
        float r5040379 = 0.5f;
        float r5040380 = r5040370 * r5040370;
        float r5040381 = r5040379 * r5040380;
        float r5040382 = r5040381 + r5040370;
        float r5040383 = r5040372 ? r5040378 : r5040382;
        return r5040383;
}

double f_od(double a, double x) {
        double r5040384 = a;
        double r5040385 = x;
        double r5040386 = r5040384 * r5040385;
        double r5040387 = -3.4442505479166693e-07;
        bool r5040388 = r5040386 <= r5040387;
        double r5040389 = exp(r5040386);
        double r5040390 = sqrt(r5040389);
        double r5040391 = 1.0;
        double r5040392 = r5040390 + r5040391;
        double r5040393 = r5040390 - r5040391;
        double r5040394 = r5040392 * r5040393;
        double r5040395 = 0.5;
        double r5040396 = r5040386 * r5040386;
        double r5040397 = r5040395 * r5040396;
        double r5040398 = r5040397 + r5040386;
        double r5040399 = r5040388 ? r5040394 : r5040398;
        return r5040399;
}

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 r5040400, r5040401, r5040402, r5040403, r5040404, r5040405;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r5040400);
        mpfr_init(r5040401);
        mpfr_init(r5040402);
        mpfr_init(r5040403);
        mpfr_init_set_str(r5040404, "1", 10, MPFR_RNDN);
        mpfr_init(r5040405);
}

double f_im(double a, double x) {
        mpfr_set_d(r5040400, a, MPFR_RNDN);
        mpfr_set_d(r5040401, x, MPFR_RNDN);
        mpfr_mul(r5040402, r5040400, r5040401, MPFR_RNDN);
        mpfr_exp(r5040403, r5040402, MPFR_RNDN);
        ;
        mpfr_sub(r5040405, r5040403, r5040404, MPFR_RNDN);
        return mpfr_get_d(r5040405, MPFR_RNDN);
}

static mpfr_t r5040406, r5040407, r5040408, r5040409, r5040410, r5040411, r5040412, r5040413, r5040414, r5040415, r5040416, r5040417, r5040418, r5040419, r5040420, r5040421;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r5040406);
        mpfr_init(r5040407);
        mpfr_init(r5040408);
        mpfr_init_set_str(r5040409, "-3.4442505479166693e-07", 10, MPFR_RNDN);
        mpfr_init(r5040410);
        mpfr_init(r5040411);
        mpfr_init(r5040412);
        mpfr_init_set_str(r5040413, "1", 10, MPFR_RNDN);
        mpfr_init(r5040414);
        mpfr_init(r5040415);
        mpfr_init(r5040416);
        mpfr_init_set_str(r5040417, "1/2", 10, MPFR_RNDN);
        mpfr_init(r5040418);
        mpfr_init(r5040419);
        mpfr_init(r5040420);
        mpfr_init(r5040421);
}

double f_fm(double a, double x) {
        mpfr_set_d(r5040406, a, MPFR_RNDN);
        mpfr_set_d(r5040407, x, MPFR_RNDN);
        mpfr_mul(r5040408, r5040406, r5040407, MPFR_RNDN);
        ;
        mpfr_set_si(r5040410, mpfr_cmp(r5040408, r5040409) <= 0, MPFR_RNDN);
        mpfr_exp(r5040411, r5040408, MPFR_RNDN);
        mpfr_sqrt(r5040412, r5040411, MPFR_RNDN);
        ;
        mpfr_add(r5040414, r5040412, r5040413, MPFR_RNDN);
        mpfr_sub(r5040415, r5040412, r5040413, MPFR_RNDN);
        mpfr_mul(r5040416, r5040414, r5040415, MPFR_RNDN);
        ;
        mpfr_mul(r5040418, r5040408, r5040408, MPFR_RNDN);
        mpfr_mul(r5040419, r5040417, r5040418, MPFR_RNDN);
        mpfr_add(r5040420, r5040419, r5040408, MPFR_RNDN);
        if (mpfr_get_si(r5040410, MPFR_RNDN)) { mpfr_set(r5040421, r5040416, MPFR_RNDN); } else { mpfr_set(r5040421, r5040420, MPFR_RNDN); };
        return mpfr_get_d(r5040421, MPFR_RNDN);
}

static mpfr_t r5040422, r5040423, r5040424, r5040425, r5040426, r5040427, r5040428, r5040429, r5040430, r5040431, r5040432, r5040433, r5040434, r5040435, r5040436, r5040437;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r5040422);
        mpfr_init(r5040423);
        mpfr_init(r5040424);
        mpfr_init_set_str(r5040425, "-3.4442505479166693e-07", 10, MPFR_RNDN);
        mpfr_init(r5040426);
        mpfr_init(r5040427);
        mpfr_init(r5040428);
        mpfr_init_set_str(r5040429, "1", 10, MPFR_RNDN);
        mpfr_init(r5040430);
        mpfr_init(r5040431);
        mpfr_init(r5040432);
        mpfr_init_set_str(r5040433, "1/2", 10, MPFR_RNDN);
        mpfr_init(r5040434);
        mpfr_init(r5040435);
        mpfr_init(r5040436);
        mpfr_init(r5040437);
}

double f_dm(double a, double x) {
        mpfr_set_d(r5040422, a, MPFR_RNDN);
        mpfr_set_d(r5040423, x, MPFR_RNDN);
        mpfr_mul(r5040424, r5040422, r5040423, MPFR_RNDN);
        ;
        mpfr_set_si(r5040426, mpfr_cmp(r5040424, r5040425) <= 0, MPFR_RNDN);
        mpfr_exp(r5040427, r5040424, MPFR_RNDN);
        mpfr_sqrt(r5040428, r5040427, MPFR_RNDN);
        ;
        mpfr_add(r5040430, r5040428, r5040429, MPFR_RNDN);
        mpfr_sub(r5040431, r5040428, r5040429, MPFR_RNDN);
        mpfr_mul(r5040432, r5040430, r5040431, MPFR_RNDN);
        ;
        mpfr_mul(r5040434, r5040424, r5040424, MPFR_RNDN);
        mpfr_mul(r5040435, r5040433, r5040434, MPFR_RNDN);
        mpfr_add(r5040436, r5040435, r5040424, MPFR_RNDN);
        if (mpfr_get_si(r5040426, MPFR_RNDN)) { mpfr_set(r5040437, r5040432, MPFR_RNDN); } else { mpfr_set(r5040437, r5040436, MPFR_RNDN); };
        return mpfr_get_d(r5040437, MPFR_RNDN);
}

