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

char *name = "Numeric.SpecFunctions:logGammaL from math-functions-0.1.5.2";

double f_if(float x, float y, float z, float t, float a) {
        float r8588 = x;
        float r8589 = y;
        float r8590 = r8588 + r8589;
        float r8591 = log(r8590);
        float r8592 = z;
        float r8593 = log(r8592);
        float r8594 = r8591 + r8593;
        float r8595 = t;
        float r8596 = r8594 - r8595;
        float r8597 = a;
        float r8598 = 0.5f;
        float r8599 = r8597 - r8598;
        float r8600 = log(r8595);
        float r8601 = r8599 * r8600;
        float r8602 = r8596 + r8601;
        return r8602;
}

double f_id(double x, double y, double z, double t, double a) {
        double r8603 = x;
        double r8604 = y;
        double r8605 = r8603 + r8604;
        double r8606 = log(r8605);
        double r8607 = z;
        double r8608 = log(r8607);
        double r8609 = r8606 + r8608;
        double r8610 = t;
        double r8611 = r8609 - r8610;
        double r8612 = a;
        double r8613 = 0.5;
        double r8614 = r8612 - r8613;
        double r8615 = log(r8610);
        double r8616 = r8614 * r8615;
        double r8617 = r8611 + r8616;
        return r8617;
}


double f_of(float x, float y, float z, float t, float a) {
        float r8618 = x;
        float r8619 = y;
        float r8620 = r8618 + r8619;
        float r8621 = log(r8620);
        float r8622 = a;
        float r8623 = 0.5f;
        float r8624 = r8622 - r8623;
        float r8625 = t;
        float r8626 = log(r8625);
        float r8627 = z;
        float r8628 = log(r8627);
        float r8629 = fma(r8624, r8626, r8628);
        float r8630 = r8629 - r8625;
        float r8631 = r8621 + r8630;
        return r8631;
}

double f_od(double x, double y, double z, double t, double a) {
        double r8632 = x;
        double r8633 = y;
        double r8634 = r8632 + r8633;
        double r8635 = log(r8634);
        double r8636 = a;
        double r8637 = 0.5;
        double r8638 = r8636 - r8637;
        double r8639 = t;
        double r8640 = log(r8639);
        double r8641 = z;
        double r8642 = log(r8641);
        double r8643 = fma(r8638, r8640, r8642);
        double r8644 = r8643 - r8639;
        double r8645 = r8635 + r8644;
        return r8645;
}

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 r8646, r8647, r8648, r8649, r8650, r8651, r8652, r8653, r8654, r8655, r8656, r8657, r8658, r8659, r8660;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r8646);
        mpfr_init(r8647);
        mpfr_init(r8648);
        mpfr_init(r8649);
        mpfr_init(r8650);
        mpfr_init(r8651);
        mpfr_init(r8652);
        mpfr_init(r8653);
        mpfr_init(r8654);
        mpfr_init(r8655);
        mpfr_init_set_str(r8656, "0.5", 10, MPFR_RNDN);
        mpfr_init(r8657);
        mpfr_init(r8658);
        mpfr_init(r8659);
        mpfr_init(r8660);
}

double f_im(double x, double y, double z, double t, double a) {
        mpfr_set_d(r8646, x, MPFR_RNDN);
        mpfr_set_d(r8647, y, MPFR_RNDN);
        mpfr_add(r8648, r8646, r8647, MPFR_RNDN);
        mpfr_log(r8649, r8648, MPFR_RNDN);
        mpfr_set_d(r8650, z, MPFR_RNDN);
        mpfr_log(r8651, r8650, MPFR_RNDN);
        mpfr_add(r8652, r8649, r8651, MPFR_RNDN);
        mpfr_set_d(r8653, t, MPFR_RNDN);
        mpfr_sub(r8654, r8652, r8653, MPFR_RNDN);
        mpfr_set_d(r8655, a, MPFR_RNDN);
        ;
        mpfr_sub(r8657, r8655, r8656, MPFR_RNDN);
        mpfr_log(r8658, r8653, MPFR_RNDN);
        mpfr_mul(r8659, r8657, r8658, MPFR_RNDN);
        mpfr_add(r8660, r8654, r8659, MPFR_RNDN);
        return mpfr_get_d(r8660, MPFR_RNDN);
}

static mpfr_t r8661, r8662, r8663, r8664, r8665, r8666, r8667, r8668, r8669, r8670, r8671, r8672, r8673, r8674;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8661);
        mpfr_init(r8662);
        mpfr_init(r8663);
        mpfr_init(r8664);
        mpfr_init(r8665);
        mpfr_init_set_str(r8666, "0.5", 10, MPFR_RNDN);
        mpfr_init(r8667);
        mpfr_init(r8668);
        mpfr_init(r8669);
        mpfr_init(r8670);
        mpfr_init(r8671);
        mpfr_init(r8672);
        mpfr_init(r8673);
        mpfr_init(r8674);
}

double f_fm(double x, double y, double z, double t, double a) {
        mpfr_set_d(r8661, x, MPFR_RNDN);
        mpfr_set_d(r8662, y, MPFR_RNDN);
        mpfr_add(r8663, r8661, r8662, MPFR_RNDN);
        mpfr_log(r8664, r8663, MPFR_RNDN);
        mpfr_set_d(r8665, a, MPFR_RNDN);
        ;
        mpfr_sub(r8667, r8665, r8666, MPFR_RNDN);
        mpfr_set_d(r8668, t, MPFR_RNDN);
        mpfr_log(r8669, r8668, MPFR_RNDN);
        mpfr_set_d(r8670, z, MPFR_RNDN);
        mpfr_log(r8671, r8670, MPFR_RNDN);
        mpfr_fma(r8672, r8667, r8669, r8671, MPFR_RNDN);
        mpfr_sub(r8673, r8672, r8668, MPFR_RNDN);
        mpfr_add(r8674, r8664, r8673, MPFR_RNDN);
        return mpfr_get_d(r8674, MPFR_RNDN);
}

static mpfr_t r8675, r8676, r8677, r8678, r8679, r8680, r8681, r8682, r8683, r8684, r8685, r8686, r8687, r8688;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8675);
        mpfr_init(r8676);
        mpfr_init(r8677);
        mpfr_init(r8678);
        mpfr_init(r8679);
        mpfr_init_set_str(r8680, "0.5", 10, MPFR_RNDN);
        mpfr_init(r8681);
        mpfr_init(r8682);
        mpfr_init(r8683);
        mpfr_init(r8684);
        mpfr_init(r8685);
        mpfr_init(r8686);
        mpfr_init(r8687);
        mpfr_init(r8688);
}

double f_dm(double x, double y, double z, double t, double a) {
        mpfr_set_d(r8675, x, MPFR_RNDN);
        mpfr_set_d(r8676, y, MPFR_RNDN);
        mpfr_add(r8677, r8675, r8676, MPFR_RNDN);
        mpfr_log(r8678, r8677, MPFR_RNDN);
        mpfr_set_d(r8679, a, MPFR_RNDN);
        ;
        mpfr_sub(r8681, r8679, r8680, MPFR_RNDN);
        mpfr_set_d(r8682, t, MPFR_RNDN);
        mpfr_log(r8683, r8682, MPFR_RNDN);
        mpfr_set_d(r8684, z, MPFR_RNDN);
        mpfr_log(r8685, r8684, MPFR_RNDN);
        mpfr_fma(r8686, r8681, r8683, r8685, MPFR_RNDN);
        mpfr_sub(r8687, r8686, r8682, MPFR_RNDN);
        mpfr_add(r8688, r8678, r8687, MPFR_RNDN);
        return mpfr_get_d(r8688, MPFR_RNDN);
}

