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

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

double f_if(float x, float y, float z) {
        float r41519 = x;
        float r41520 = y;
        float r41521 = 0.5;
        float r41522 = r41520 + r41521;
        float r41523 = log(r41520);
        float r41524 = r41522 * r41523;
        float r41525 = r41519 - r41524;
        float r41526 = r41525 + r41520;
        float r41527 = z;
        float r41528 = r41526 - r41527;
        return r41528;
}

double f_id(double x, double y, double z) {
        double r41529 = x;
        double r41530 = y;
        double r41531 = 0.5;
        double r41532 = r41530 + r41531;
        double r41533 = log(r41530);
        double r41534 = r41532 * r41533;
        double r41535 = r41529 - r41534;
        double r41536 = r41535 + r41530;
        double r41537 = z;
        double r41538 = r41536 - r41537;
        return r41538;
}


double f_of(float x, float y, float z) {
        float r41539 = x;
        float r41540 = y;
        float r41541 = 0.5;
        float r41542 = r41540 + r41541;
        float r41543 = log(r41540);
        float r41544 = r41542 * r41543;
        float r41545 = r41539 - r41544;
        float r41546 = r41545 + r41540;
        float r41547 = z;
        float r41548 = r41546 - r41547;
        return r41548;
}

double f_od(double x, double y, double z) {
        double r41549 = x;
        double r41550 = y;
        double r41551 = 0.5;
        double r41552 = r41550 + r41551;
        double r41553 = log(r41550);
        double r41554 = r41552 * r41553;
        double r41555 = r41549 - r41554;
        double r41556 = r41555 + r41550;
        double r41557 = z;
        double r41558 = r41556 - r41557;
        return r41558;
}

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 r41559, r41560, r41561, r41562, r41563, r41564, r41565, r41566, r41567, r41568;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r41559);
        mpfr_init(r41560);
        mpfr_init_set_str(r41561, "0.5", 10, MPFR_RNDN);
        mpfr_init(r41562);
        mpfr_init(r41563);
        mpfr_init(r41564);
        mpfr_init(r41565);
        mpfr_init(r41566);
        mpfr_init(r41567);
        mpfr_init(r41568);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r41559, x, MPFR_RNDN);
        mpfr_set_d(r41560, y, MPFR_RNDN);
        ;
        mpfr_add(r41562, r41560, r41561, MPFR_RNDN);
        mpfr_log(r41563, r41560, MPFR_RNDN);
        mpfr_mul(r41564, r41562, r41563, MPFR_RNDN);
        mpfr_sub(r41565, r41559, r41564, MPFR_RNDN);
        mpfr_add(r41566, r41565, r41560, MPFR_RNDN);
        mpfr_set_d(r41567, z, MPFR_RNDN);
        mpfr_sub(r41568, r41566, r41567, MPFR_RNDN);
        return mpfr_get_d(r41568, MPFR_RNDN);
}

static mpfr_t r41569, r41570, r41571, r41572, r41573, r41574, r41575, r41576, r41577, r41578;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r41569);
        mpfr_init(r41570);
        mpfr_init_set_str(r41571, "0.5", 10, MPFR_RNDN);
        mpfr_init(r41572);
        mpfr_init(r41573);
        mpfr_init(r41574);
        mpfr_init(r41575);
        mpfr_init(r41576);
        mpfr_init(r41577);
        mpfr_init(r41578);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r41569, x, MPFR_RNDN);
        mpfr_set_d(r41570, y, MPFR_RNDN);
        ;
        mpfr_add(r41572, r41570, r41571, MPFR_RNDN);
        mpfr_log(r41573, r41570, MPFR_RNDN);
        mpfr_mul(r41574, r41572, r41573, MPFR_RNDN);
        mpfr_sub(r41575, r41569, r41574, MPFR_RNDN);
        mpfr_add(r41576, r41575, r41570, MPFR_RNDN);
        mpfr_set_d(r41577, z, MPFR_RNDN);
        mpfr_sub(r41578, r41576, r41577, MPFR_RNDN);
        return mpfr_get_d(r41578, MPFR_RNDN);
}

static mpfr_t r41579, r41580, r41581, r41582, r41583, r41584, r41585, r41586, r41587, r41588;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r41579);
        mpfr_init(r41580);
        mpfr_init_set_str(r41581, "0.5", 10, MPFR_RNDN);
        mpfr_init(r41582);
        mpfr_init(r41583);
        mpfr_init(r41584);
        mpfr_init(r41585);
        mpfr_init(r41586);
        mpfr_init(r41587);
        mpfr_init(r41588);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r41579, x, MPFR_RNDN);
        mpfr_set_d(r41580, y, MPFR_RNDN);
        ;
        mpfr_add(r41582, r41580, r41581, MPFR_RNDN);
        mpfr_log(r41583, r41580, MPFR_RNDN);
        mpfr_mul(r41584, r41582, r41583, MPFR_RNDN);
        mpfr_sub(r41585, r41579, r41584, MPFR_RNDN);
        mpfr_add(r41586, r41585, r41580, MPFR_RNDN);
        mpfr_set_d(r41587, z, MPFR_RNDN);
        mpfr_sub(r41588, r41586, r41587, MPFR_RNDN);
        return mpfr_get_d(r41588, MPFR_RNDN);
}

