#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 r18361017 = x;
        float r18361018 = exp(r18361017);
        float r18361019 = -r18361017;
        float r18361020 = exp(r18361019);
        float r18361021 = r18361018 - r18361020;
        float r18361022 = r18361018 + r18361020;
        float r18361023 = r18361021 / r18361022;
        return r18361023;
}

double f_id(double x) {
        double r18361024 = x;
        double r18361025 = exp(r18361024);
        double r18361026 = -r18361024;
        double r18361027 = exp(r18361026);
        double r18361028 = r18361025 - r18361027;
        double r18361029 = r18361025 + r18361027;
        double r18361030 = r18361028 / r18361029;
        return r18361030;
}


double f_of(float x) {
        float r18361031 = x;
        float r18361032 = tanh(r18361031);
        return r18361032;
}

double f_od(double x) {
        double r18361033 = x;
        double r18361034 = tanh(r18361033);
        return r18361034;
}

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 r18361035, r18361036, r18361037, r18361038, r18361039, r18361040, r18361041;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r18361035);
        mpfr_init(r18361036);
        mpfr_init(r18361037);
        mpfr_init(r18361038);
        mpfr_init(r18361039);
        mpfr_init(r18361040);
        mpfr_init(r18361041);
}

double f_im(double x) {
        mpfr_set_d(r18361035, x, MPFR_RNDN);
        mpfr_exp(r18361036, r18361035, MPFR_RNDN);
        mpfr_neg(r18361037, r18361035, MPFR_RNDN);
        mpfr_exp(r18361038, r18361037, MPFR_RNDN);
        mpfr_sub(r18361039, r18361036, r18361038, MPFR_RNDN);
        mpfr_add(r18361040, r18361036, r18361038, MPFR_RNDN);
        mpfr_div(r18361041, r18361039, r18361040, MPFR_RNDN);
        return mpfr_get_d(r18361041, MPFR_RNDN);
}

static mpfr_t r18361042, r18361043;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r18361042);
        mpfr_init(r18361043);
}

double f_fm(double x) {
        mpfr_set_d(r18361042, x, MPFR_RNDN);
        mpfr_tanh(r18361043, r18361042, MPFR_RNDN);
        return mpfr_get_d(r18361043, MPFR_RNDN);
}

static mpfr_t r18361044, r18361045;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r18361044);
        mpfr_init(r18361045);
}

double f_dm(double x) {
        mpfr_set_d(r18361044, x, MPFR_RNDN);
        mpfr_tanh(r18361045, r18361044, MPFR_RNDN);
        return mpfr_get_d(r18361045, MPFR_RNDN);
}

