#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 r8903 = x;
        float r8904 = exp(r8903);
        float r8905 = -r8903;
        float r8906 = exp(r8905);
        float r8907 = r8904 - r8906;
        float r8908 = r8904 + r8906;
        float r8909 = r8907 / r8908;
        return r8909;
}

double f_id(double x) {
        double r8910 = x;
        double r8911 = exp(r8910);
        double r8912 = -r8910;
        double r8913 = exp(r8912);
        double r8914 = r8911 - r8913;
        double r8915 = r8911 + r8913;
        double r8916 = r8914 / r8915;
        return r8916;
}


double f_of(float x) {
        float r8917 = x;
        float r8918 = tanh(r8917);
        return r8918;
}

double f_od(double x) {
        double r8919 = x;
        double r8920 = tanh(r8919);
        return r8920;
}

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 r8921, r8922, r8923, r8924, r8925, r8926, r8927;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8921);
        mpfr_init(r8922);
        mpfr_init(r8923);
        mpfr_init(r8924);
        mpfr_init(r8925);
        mpfr_init(r8926);
        mpfr_init(r8927);
}

double f_im(double x) {
        mpfr_set_d(r8921, x, MPFR_RNDN);
        mpfr_exp(r8922, r8921, MPFR_RNDN);
        mpfr_neg(r8923, r8921, MPFR_RNDN);
        mpfr_exp(r8924, r8923, MPFR_RNDN);
        mpfr_sub(r8925, r8922, r8924, MPFR_RNDN);
        mpfr_add(r8926, r8922, r8924, MPFR_RNDN);
        mpfr_div(r8927, r8925, r8926, MPFR_RNDN);
        return mpfr_get_d(r8927, MPFR_RNDN);
}

static mpfr_t r8928, r8929;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8928);
        mpfr_init(r8929);
}

double f_fm(double x) {
        mpfr_set_d(r8928, x, MPFR_RNDN);
        mpfr_tanh(r8929, r8928, MPFR_RNDN);
        return mpfr_get_d(r8929, MPFR_RNDN);
}

static mpfr_t r8930, r8931;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8930);
        mpfr_init(r8931);
}

double f_dm(double x) {
        mpfr_set_d(r8930, x, MPFR_RNDN);
        mpfr_tanh(r8931, r8930, MPFR_RNDN);
        return mpfr_get_d(r8931, MPFR_RNDN);
}

