#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 r30901 = x;
        float r30902 = r30901 * r30901;
        float r30903 = 1;
        float r30904 = r30902 - r30903;
        float r30905 = sqrt(r30904);
        float r30906 = r30901 + r30905;
        float r30907 = log(r30906);
        return r30907;
}

double f_id(double x) {
        double r30908 = x;
        double r30909 = r30908 * r30908;
        double r30910 = 1;
        double r30911 = r30909 - r30910;
        double r30912 = sqrt(r30911);
        double r30913 = r30908 + r30912;
        double r30914 = log(r30913);
        return r30914;
}


double f_of(float x) {
        float r30915 = x;
        float r30916 = r30915 + r30915;
        float r30917 = 1/2;
        float r30918 = r30917 / r30915;
        float r30919 = r30916 - r30918;
        float r30920 = 1/8;
        float r30921 = r30920 / r30915;
        float r30922 = r30915 * r30915;
        float r30923 = r30921 / r30922;
        float r30924 = r30919 - r30923;
        float r30925 = log(r30924);
        return r30925;
}

double f_od(double x) {
        double r30926 = x;
        double r30927 = r30926 + r30926;
        double r30928 = 1/2;
        double r30929 = r30928 / r30926;
        double r30930 = r30927 - r30929;
        double r30931 = 1/8;
        double r30932 = r30931 / r30926;
        double r30933 = r30926 * r30926;
        double r30934 = r30932 / r30933;
        double r30935 = r30930 - r30934;
        double r30936 = log(r30935);
        return r30936;
}

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 r30937, r30938, r30939, r30940, r30941, r30942, r30943;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2448);
        mpfr_init(r30937);
        mpfr_init(r30938);
        mpfr_init_set_str(r30939, "1", 10, MPFR_RNDN);
        mpfr_init(r30940);
        mpfr_init(r30941);
        mpfr_init(r30942);
        mpfr_init(r30943);
}

double f_im(double x) {
        mpfr_set_d(r30937, x, MPFR_RNDN);
        mpfr_mul(r30938, r30937, r30937, MPFR_RNDN);
        ;
        mpfr_sub(r30940, r30938, r30939, MPFR_RNDN);
        mpfr_sqrt(r30941, r30940, MPFR_RNDN);
        mpfr_add(r30942, r30937, r30941, MPFR_RNDN);
        mpfr_log(r30943, r30942, MPFR_RNDN);
        return mpfr_get_d(r30943, MPFR_RNDN);
}

static mpfr_t r30944, r30945, r30946, r30947, r30948, r30949, r30950, r30951, r30952, r30953, r30954;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r30944);
        mpfr_init(r30945);
        mpfr_init_set_str(r30946, "1/2", 10, MPFR_RNDN);
        mpfr_init(r30947);
        mpfr_init(r30948);
        mpfr_init_set_str(r30949, "1/8", 10, MPFR_RNDN);
        mpfr_init(r30950);
        mpfr_init(r30951);
        mpfr_init(r30952);
        mpfr_init(r30953);
        mpfr_init(r30954);
}

double f_fm(double x) {
        mpfr_set_d(r30944, x, MPFR_RNDN);
        mpfr_add(r30945, r30944, r30944, MPFR_RNDN);
        ;
        mpfr_div(r30947, r30946, r30944, MPFR_RNDN);
        mpfr_sub(r30948, r30945, r30947, MPFR_RNDN);
        ;
        mpfr_div(r30950, r30949, r30944, MPFR_RNDN);
        mpfr_mul(r30951, r30944, r30944, MPFR_RNDN);
        mpfr_div(r30952, r30950, r30951, MPFR_RNDN);
        mpfr_sub(r30953, r30948, r30952, MPFR_RNDN);
        mpfr_log(r30954, r30953, MPFR_RNDN);
        return mpfr_get_d(r30954, MPFR_RNDN);
}

static mpfr_t r30955, r30956, r30957, r30958, r30959, r30960, r30961, r30962, r30963, r30964, r30965;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2448);
        mpfr_init(r30955);
        mpfr_init(r30956);
        mpfr_init_set_str(r30957, "1/2", 10, MPFR_RNDN);
        mpfr_init(r30958);
        mpfr_init(r30959);
        mpfr_init_set_str(r30960, "1/8", 10, MPFR_RNDN);
        mpfr_init(r30961);
        mpfr_init(r30962);
        mpfr_init(r30963);
        mpfr_init(r30964);
        mpfr_init(r30965);
}

double f_dm(double x) {
        mpfr_set_d(r30955, x, MPFR_RNDN);
        mpfr_add(r30956, r30955, r30955, MPFR_RNDN);
        ;
        mpfr_div(r30958, r30957, r30955, MPFR_RNDN);
        mpfr_sub(r30959, r30956, r30958, MPFR_RNDN);
        ;
        mpfr_div(r30961, r30960, r30955, MPFR_RNDN);
        mpfr_mul(r30962, r30955, r30955, MPFR_RNDN);
        mpfr_div(r30963, r30961, r30962, MPFR_RNDN);
        mpfr_sub(r30964, r30959, r30963, MPFR_RNDN);
        mpfr_log(r30965, r30964, MPFR_RNDN);
        return mpfr_get_d(r30965, MPFR_RNDN);
}

