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

char *name = "Hyperbolic tangent";

double f_if(float x) {
        float r31018 = x;
        float r31019 = exp(r31018);
        float r31020 = -r31018;
        float r31021 = exp(r31020);
        float r31022 = r31019 - r31021;
        float r31023 = r31019 + r31021;
        float r31024 = r31022 / r31023;
        return r31024;
}

double f_id(double x) {
        double r31025 = x;
        double r31026 = exp(r31025);
        double r31027 = -r31025;
        double r31028 = exp(r31027);
        double r31029 = r31026 - r31028;
        double r31030 = r31026 + r31028;
        double r31031 = r31029 / r31030;
        return r31031;
}


double f_of(float x) {
        float r31032 = x;
        float r31033 = tanh(r31032);
        return r31033;
}

double f_od(double x) {
        double r31034 = x;
        double r31035 = tanh(r31034);
        return r31035;
}

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 r31036, r31037, r31038, r31039, r31040, r31041, r31042;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r31036);
        mpfr_init(r31037);
        mpfr_init(r31038);
        mpfr_init(r31039);
        mpfr_init(r31040);
        mpfr_init(r31041);
        mpfr_init(r31042);
}

double f_im(double x) {
        mpfr_set_d(r31036, x, MPFR_RNDN);
        mpfr_exp(r31037, r31036, MPFR_RNDN);
        mpfr_neg(r31038, r31036, MPFR_RNDN);
        mpfr_exp(r31039, r31038, MPFR_RNDN);
        mpfr_sub(r31040, r31037, r31039, MPFR_RNDN);
        mpfr_add(r31041, r31037, r31039, MPFR_RNDN);
        mpfr_div(r31042, r31040, r31041, MPFR_RNDN);
        return mpfr_get_d(r31042, MPFR_RNDN);
}

static mpfr_t r31043, r31044;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r31043);
        mpfr_init(r31044);
}

double f_fm(double x) {
        mpfr_set_d(r31043, x, MPFR_RNDN);
        mpfr_tanh(r31044, r31043, MPFR_RNDN);
        return mpfr_get_d(r31044, MPFR_RNDN);
}

static mpfr_t r31045, r31046;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r31045);
        mpfr_init(r31046);
}

double f_dm(double x) {
        mpfr_set_d(r31045, x, MPFR_RNDN);
        mpfr_tanh(r31046, r31045, MPFR_RNDN);
        return mpfr_get_d(r31046, MPFR_RNDN);
}

