#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 r31506 = x;
        float r31507 = r31506 * r31506;
        float r31508 = 1;
        float r31509 = r31507 - r31508;
        float r31510 = sqrt(r31509);
        float r31511 = r31506 + r31510;
        float r31512 = log(r31511);
        return r31512;
}

double f_id(double x) {
        double r31513 = x;
        double r31514 = r31513 * r31513;
        double r31515 = 1;
        double r31516 = r31514 - r31515;
        double r31517 = sqrt(r31516);
        double r31518 = r31513 + r31517;
        double r31519 = log(r31518);
        return r31519;
}


double f_of(float x) {
        float r31520 = x;
        float r31521 = r31520 + r31520;
        float r31522 = 1/2;
        float r31523 = r31522 / r31520;
        float r31524 = r31521 - r31523;
        float r31525 = 1/8;
        float r31526 = r31525 / r31520;
        float r31527 = r31520 * r31520;
        float r31528 = r31526 / r31527;
        float r31529 = r31524 - r31528;
        float r31530 = log(r31529);
        return r31530;
}

double f_od(double x) {
        double r31531 = x;
        double r31532 = r31531 + r31531;
        double r31533 = 1/2;
        double r31534 = r31533 / r31531;
        double r31535 = r31532 - r31534;
        double r31536 = 1/8;
        double r31537 = r31536 / r31531;
        double r31538 = r31531 * r31531;
        double r31539 = r31537 / r31538;
        double r31540 = r31535 - r31539;
        double r31541 = log(r31540);
        return r31541;
}

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 r31542, r31543, r31544, r31545, r31546, r31547, r31548;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r31542);
        mpfr_init(r31543);
        mpfr_init_set_str(r31544, "1", 10, MPFR_RNDN);
        mpfr_init(r31545);
        mpfr_init(r31546);
        mpfr_init(r31547);
        mpfr_init(r31548);
}

double f_im(double x) {
        mpfr_set_d(r31542, x, MPFR_RNDN);
        mpfr_mul(r31543, r31542, r31542, MPFR_RNDN);
        ;
        mpfr_sub(r31545, r31543, r31544, MPFR_RNDN);
        mpfr_sqrt(r31546, r31545, MPFR_RNDN);
        mpfr_add(r31547, r31542, r31546, MPFR_RNDN);
        mpfr_log(r31548, r31547, MPFR_RNDN);
        return mpfr_get_d(r31548, MPFR_RNDN);
}

static mpfr_t r31549, r31550, r31551, r31552, r31553, r31554, r31555, r31556, r31557, r31558, r31559;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r31549);
        mpfr_init(r31550);
        mpfr_init_set_str(r31551, "1/2", 10, MPFR_RNDN);
        mpfr_init(r31552);
        mpfr_init(r31553);
        mpfr_init_set_str(r31554, "1/8", 10, MPFR_RNDN);
        mpfr_init(r31555);
        mpfr_init(r31556);
        mpfr_init(r31557);
        mpfr_init(r31558);
        mpfr_init(r31559);
}

double f_fm(double x) {
        mpfr_set_d(r31549, x, MPFR_RNDN);
        mpfr_add(r31550, r31549, r31549, MPFR_RNDN);
        ;
        mpfr_div(r31552, r31551, r31549, MPFR_RNDN);
        mpfr_sub(r31553, r31550, r31552, MPFR_RNDN);
        ;
        mpfr_div(r31555, r31554, r31549, MPFR_RNDN);
        mpfr_mul(r31556, r31549, r31549, MPFR_RNDN);
        mpfr_div(r31557, r31555, r31556, MPFR_RNDN);
        mpfr_sub(r31558, r31553, r31557, MPFR_RNDN);
        mpfr_log(r31559, r31558, MPFR_RNDN);
        return mpfr_get_d(r31559, MPFR_RNDN);
}

static mpfr_t r31560, r31561, r31562, r31563, r31564, r31565, r31566, r31567, r31568, r31569, r31570;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r31560);
        mpfr_init(r31561);
        mpfr_init_set_str(r31562, "1/2", 10, MPFR_RNDN);
        mpfr_init(r31563);
        mpfr_init(r31564);
        mpfr_init_set_str(r31565, "1/8", 10, MPFR_RNDN);
        mpfr_init(r31566);
        mpfr_init(r31567);
        mpfr_init(r31568);
        mpfr_init(r31569);
        mpfr_init(r31570);
}

double f_dm(double x) {
        mpfr_set_d(r31560, x, MPFR_RNDN);
        mpfr_add(r31561, r31560, r31560, MPFR_RNDN);
        ;
        mpfr_div(r31563, r31562, r31560, MPFR_RNDN);
        mpfr_sub(r31564, r31561, r31563, MPFR_RNDN);
        ;
        mpfr_div(r31566, r31565, r31560, MPFR_RNDN);
        mpfr_mul(r31567, r31560, r31560, MPFR_RNDN);
        mpfr_div(r31568, r31566, r31567, MPFR_RNDN);
        mpfr_sub(r31569, r31564, r31568, MPFR_RNDN);
        mpfr_log(r31570, r31569, MPFR_RNDN);
        return mpfr_get_d(r31570, MPFR_RNDN);
}

