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

char *name = "Hyperbolic arc-cosine";

double f_if(float x) {
        float r31173 = x;
        float r31174 = r31173 * r31173;
        float r31175 = 1;
        float r31176 = r31174 - r31175;
        float r31177 = sqrt(r31176);
        float r31178 = r31173 + r31177;
        float r31179 = log(r31178);
        return r31179;
}

double f_id(double x) {
        double r31180 = x;
        double r31181 = r31180 * r31180;
        double r31182 = 1;
        double r31183 = r31181 - r31182;
        double r31184 = sqrt(r31183);
        double r31185 = r31180 + r31184;
        double r31186 = log(r31185);
        return r31186;
}


double f_of(float x) {
        float r31187 = x;
        float r31188 = r31187 + r31187;
        float r31189 = 1/2;
        float r31190 = r31189 / r31187;
        float r31191 = r31188 - r31190;
        float r31192 = 1/8;
        float r31193 = r31192 / r31187;
        float r31194 = r31187 * r31187;
        float r31195 = r31193 / r31194;
        float r31196 = r31191 - r31195;
        float r31197 = log(r31196);
        return r31197;
}

double f_od(double x) {
        double r31198 = x;
        double r31199 = r31198 + r31198;
        double r31200 = 1/2;
        double r31201 = r31200 / r31198;
        double r31202 = r31199 - r31201;
        double r31203 = 1/8;
        double r31204 = r31203 / r31198;
        double r31205 = r31198 * r31198;
        double r31206 = r31204 / r31205;
        double r31207 = r31202 - r31206;
        double r31208 = log(r31207);
        return r31208;
}

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 r31209, r31210, r31211, r31212, r31213, r31214, r31215;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r31209);
        mpfr_init(r31210);
        mpfr_init_set_str(r31211, "1", 10, MPFR_RNDN);
        mpfr_init(r31212);
        mpfr_init(r31213);
        mpfr_init(r31214);
        mpfr_init(r31215);
}

double f_im(double x) {
        mpfr_set_d(r31209, x, MPFR_RNDN);
        mpfr_mul(r31210, r31209, r31209, MPFR_RNDN);
        ;
        mpfr_sub(r31212, r31210, r31211, MPFR_RNDN);
        mpfr_sqrt(r31213, r31212, MPFR_RNDN);
        mpfr_add(r31214, r31209, r31213, MPFR_RNDN);
        mpfr_log(r31215, r31214, MPFR_RNDN);
        return mpfr_get_d(r31215, MPFR_RNDN);
}

static mpfr_t r31216, r31217, r31218, r31219, r31220, r31221, r31222, r31223, r31224, r31225, r31226;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r31216);
        mpfr_init(r31217);
        mpfr_init_set_str(r31218, "1/2", 10, MPFR_RNDN);
        mpfr_init(r31219);
        mpfr_init(r31220);
        mpfr_init_set_str(r31221, "1/8", 10, MPFR_RNDN);
        mpfr_init(r31222);
        mpfr_init(r31223);
        mpfr_init(r31224);
        mpfr_init(r31225);
        mpfr_init(r31226);
}

double f_fm(double x) {
        mpfr_set_d(r31216, x, MPFR_RNDN);
        mpfr_add(r31217, r31216, r31216, MPFR_RNDN);
        ;
        mpfr_div(r31219, r31218, r31216, MPFR_RNDN);
        mpfr_sub(r31220, r31217, r31219, MPFR_RNDN);
        ;
        mpfr_div(r31222, r31221, r31216, MPFR_RNDN);
        mpfr_mul(r31223, r31216, r31216, MPFR_RNDN);
        mpfr_div(r31224, r31222, r31223, MPFR_RNDN);
        mpfr_sub(r31225, r31220, r31224, MPFR_RNDN);
        mpfr_log(r31226, r31225, MPFR_RNDN);
        return mpfr_get_d(r31226, MPFR_RNDN);
}

static mpfr_t r31227, r31228, r31229, r31230, r31231, r31232, r31233, r31234, r31235, r31236, r31237;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r31227);
        mpfr_init(r31228);
        mpfr_init_set_str(r31229, "1/2", 10, MPFR_RNDN);
        mpfr_init(r31230);
        mpfr_init(r31231);
        mpfr_init_set_str(r31232, "1/8", 10, MPFR_RNDN);
        mpfr_init(r31233);
        mpfr_init(r31234);
        mpfr_init(r31235);
        mpfr_init(r31236);
        mpfr_init(r31237);
}

double f_dm(double x) {
        mpfr_set_d(r31227, x, MPFR_RNDN);
        mpfr_add(r31228, r31227, r31227, MPFR_RNDN);
        ;
        mpfr_div(r31230, r31229, r31227, MPFR_RNDN);
        mpfr_sub(r31231, r31228, r31230, MPFR_RNDN);
        ;
        mpfr_div(r31233, r31232, r31227, MPFR_RNDN);
        mpfr_mul(r31234, r31227, r31227, MPFR_RNDN);
        mpfr_div(r31235, r31233, r31234, MPFR_RNDN);
        mpfr_sub(r31236, r31231, r31235, MPFR_RNDN);
        mpfr_log(r31237, r31236, MPFR_RNDN);
        return mpfr_get_d(r31237, MPFR_RNDN);
}

