#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 r41860 = x;
        float r41861 = y;
        float r41862 = 0.5;
        float r41863 = r41861 + r41862;
        float r41864 = log(r41861);
        float r41865 = r41863 * r41864;
        float r41866 = r41860 - r41865;
        float r41867 = r41866 + r41861;
        float r41868 = z;
        float r41869 = r41867 - r41868;
        return r41869;
}

double f_id(double x, double y, double z) {
        double r41870 = x;
        double r41871 = y;
        double r41872 = 0.5;
        double r41873 = r41871 + r41872;
        double r41874 = log(r41871);
        double r41875 = r41873 * r41874;
        double r41876 = r41870 - r41875;
        double r41877 = r41876 + r41871;
        double r41878 = z;
        double r41879 = r41877 - r41878;
        return r41879;
}


double f_of(float x, float y, float z) {
        float r41880 = x;
        float r41881 = y;
        float r41882 = 0.5;
        float r41883 = r41881 + r41882;
        float r41884 = log(r41881);
        float r41885 = r41883 * r41884;
        float r41886 = r41880 - r41885;
        float r41887 = r41886 + r41881;
        float r41888 = z;
        float r41889 = r41887 - r41888;
        return r41889;
}

double f_od(double x, double y, double z) {
        double r41890 = x;
        double r41891 = y;
        double r41892 = 0.5;
        double r41893 = r41891 + r41892;
        double r41894 = log(r41891);
        double r41895 = r41893 * r41894;
        double r41896 = r41890 - r41895;
        double r41897 = r41896 + r41891;
        double r41898 = z;
        double r41899 = r41897 - r41898;
        return r41899;
}

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 r41900, r41901, r41902, r41903, r41904, r41905, r41906, r41907, r41908, r41909;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r41900);
        mpfr_init(r41901);
        mpfr_init_set_str(r41902, "0.5", 10, MPFR_RNDN);
        mpfr_init(r41903);
        mpfr_init(r41904);
        mpfr_init(r41905);
        mpfr_init(r41906);
        mpfr_init(r41907);
        mpfr_init(r41908);
        mpfr_init(r41909);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r41900, x, MPFR_RNDN);
        mpfr_set_d(r41901, y, MPFR_RNDN);
        ;
        mpfr_add(r41903, r41901, r41902, MPFR_RNDN);
        mpfr_log(r41904, r41901, MPFR_RNDN);
        mpfr_mul(r41905, r41903, r41904, MPFR_RNDN);
        mpfr_sub(r41906, r41900, r41905, MPFR_RNDN);
        mpfr_add(r41907, r41906, r41901, MPFR_RNDN);
        mpfr_set_d(r41908, z, MPFR_RNDN);
        mpfr_sub(r41909, r41907, r41908, MPFR_RNDN);
        return mpfr_get_d(r41909, MPFR_RNDN);
}

static mpfr_t r41910, r41911, r41912, r41913, r41914, r41915, r41916, r41917, r41918, r41919;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r41910);
        mpfr_init(r41911);
        mpfr_init_set_str(r41912, "0.5", 10, MPFR_RNDN);
        mpfr_init(r41913);
        mpfr_init(r41914);
        mpfr_init(r41915);
        mpfr_init(r41916);
        mpfr_init(r41917);
        mpfr_init(r41918);
        mpfr_init(r41919);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r41910, x, MPFR_RNDN);
        mpfr_set_d(r41911, y, MPFR_RNDN);
        ;
        mpfr_add(r41913, r41911, r41912, MPFR_RNDN);
        mpfr_log(r41914, r41911, MPFR_RNDN);
        mpfr_mul(r41915, r41913, r41914, MPFR_RNDN);
        mpfr_sub(r41916, r41910, r41915, MPFR_RNDN);
        mpfr_add(r41917, r41916, r41911, MPFR_RNDN);
        mpfr_set_d(r41918, z, MPFR_RNDN);
        mpfr_sub(r41919, r41917, r41918, MPFR_RNDN);
        return mpfr_get_d(r41919, MPFR_RNDN);
}

static mpfr_t r41920, r41921, r41922, r41923, r41924, r41925, r41926, r41927, r41928, r41929;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r41920);
        mpfr_init(r41921);
        mpfr_init_set_str(r41922, "0.5", 10, MPFR_RNDN);
        mpfr_init(r41923);
        mpfr_init(r41924);
        mpfr_init(r41925);
        mpfr_init(r41926);
        mpfr_init(r41927);
        mpfr_init(r41928);
        mpfr_init(r41929);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r41920, x, MPFR_RNDN);
        mpfr_set_d(r41921, y, MPFR_RNDN);
        ;
        mpfr_add(r41923, r41921, r41922, MPFR_RNDN);
        mpfr_log(r41924, r41921, MPFR_RNDN);
        mpfr_mul(r41925, r41923, r41924, MPFR_RNDN);
        mpfr_sub(r41926, r41920, r41925, MPFR_RNDN);
        mpfr_add(r41927, r41926, r41921, MPFR_RNDN);
        mpfr_set_d(r41928, z, MPFR_RNDN);
        mpfr_sub(r41929, r41927, r41928, MPFR_RNDN);
        return mpfr_get_d(r41929, MPFR_RNDN);
}

