#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 r31093 = x;
        float r31094 = r31093 * r31093;
        float r31095 = 1;
        float r31096 = r31094 - r31095;
        float r31097 = sqrt(r31096);
        float r31098 = r31093 + r31097;
        float r31099 = log(r31098);
        return r31099;
}

double f_id(double x) {
        double r31100 = x;
        double r31101 = r31100 * r31100;
        double r31102 = 1;
        double r31103 = r31101 - r31102;
        double r31104 = sqrt(r31103);
        double r31105 = r31100 + r31104;
        double r31106 = log(r31105);
        return r31106;
}


double f_of(float x) {
        float r31107 = x;
        float r31108 = r31107 + r31107;
        float r31109 = 1/2;
        float r31110 = r31109 / r31107;
        float r31111 = r31108 - r31110;
        float r31112 = 1/8;
        float r31113 = r31112 / r31107;
        float r31114 = r31107 * r31107;
        float r31115 = r31113 / r31114;
        float r31116 = r31111 - r31115;
        float r31117 = log(r31116);
        return r31117;
}

double f_od(double x) {
        double r31118 = x;
        double r31119 = r31118 + r31118;
        double r31120 = 1/2;
        double r31121 = r31120 / r31118;
        double r31122 = r31119 - r31121;
        double r31123 = 1/8;
        double r31124 = r31123 / r31118;
        double r31125 = r31118 * r31118;
        double r31126 = r31124 / r31125;
        double r31127 = r31122 - r31126;
        double r31128 = log(r31127);
        return r31128;
}

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 r31129, r31130, r31131, r31132, r31133, r31134, r31135;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r31129);
        mpfr_init(r31130);
        mpfr_init_set_str(r31131, "1", 10, MPFR_RNDN);
        mpfr_init(r31132);
        mpfr_init(r31133);
        mpfr_init(r31134);
        mpfr_init(r31135);
}

double f_im(double x) {
        mpfr_set_d(r31129, x, MPFR_RNDN);
        mpfr_mul(r31130, r31129, r31129, MPFR_RNDN);
        ;
        mpfr_sub(r31132, r31130, r31131, MPFR_RNDN);
        mpfr_sqrt(r31133, r31132, MPFR_RNDN);
        mpfr_add(r31134, r31129, r31133, MPFR_RNDN);
        mpfr_log(r31135, r31134, MPFR_RNDN);
        return mpfr_get_d(r31135, MPFR_RNDN);
}

static mpfr_t r31136, r31137, r31138, r31139, r31140, r31141, r31142, r31143, r31144, r31145, r31146;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r31136);
        mpfr_init(r31137);
        mpfr_init_set_str(r31138, "1/2", 10, MPFR_RNDN);
        mpfr_init(r31139);
        mpfr_init(r31140);
        mpfr_init_set_str(r31141, "1/8", 10, MPFR_RNDN);
        mpfr_init(r31142);
        mpfr_init(r31143);
        mpfr_init(r31144);
        mpfr_init(r31145);
        mpfr_init(r31146);
}

double f_fm(double x) {
        mpfr_set_d(r31136, x, MPFR_RNDN);
        mpfr_add(r31137, r31136, r31136, MPFR_RNDN);
        ;
        mpfr_div(r31139, r31138, r31136, MPFR_RNDN);
        mpfr_sub(r31140, r31137, r31139, MPFR_RNDN);
        ;
        mpfr_div(r31142, r31141, r31136, MPFR_RNDN);
        mpfr_mul(r31143, r31136, r31136, MPFR_RNDN);
        mpfr_div(r31144, r31142, r31143, MPFR_RNDN);
        mpfr_sub(r31145, r31140, r31144, MPFR_RNDN);
        mpfr_log(r31146, r31145, MPFR_RNDN);
        return mpfr_get_d(r31146, MPFR_RNDN);
}

static mpfr_t r31147, r31148, r31149, r31150, r31151, r31152, r31153, r31154, r31155, r31156, r31157;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r31147);
        mpfr_init(r31148);
        mpfr_init_set_str(r31149, "1/2", 10, MPFR_RNDN);
        mpfr_init(r31150);
        mpfr_init(r31151);
        mpfr_init_set_str(r31152, "1/8", 10, MPFR_RNDN);
        mpfr_init(r31153);
        mpfr_init(r31154);
        mpfr_init(r31155);
        mpfr_init(r31156);
        mpfr_init(r31157);
}

double f_dm(double x) {
        mpfr_set_d(r31147, x, MPFR_RNDN);
        mpfr_add(r31148, r31147, r31147, MPFR_RNDN);
        ;
        mpfr_div(r31150, r31149, r31147, MPFR_RNDN);
        mpfr_sub(r31151, r31148, r31150, MPFR_RNDN);
        ;
        mpfr_div(r31153, r31152, r31147, MPFR_RNDN);
        mpfr_mul(r31154, r31147, r31147, MPFR_RNDN);
        mpfr_div(r31155, r31153, r31154, MPFR_RNDN);
        mpfr_sub(r31156, r31151, r31155, MPFR_RNDN);
        mpfr_log(r31157, r31156, MPFR_RNDN);
        return mpfr_get_d(r31157, MPFR_RNDN);
}

