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

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

double f_if(float x, float y, float z) {
        float r45033 = x;
        float r45034 = y;
        float r45035 = z;
        float r45036 = r45034 + r45035;
        float r45037 = r45033 * r45036;
        float r45038 = r45037 / r45035;
        return r45038;
}

double f_id(double x, double y, double z) {
        double r45039 = x;
        double r45040 = y;
        double r45041 = z;
        double r45042 = r45040 + r45041;
        double r45043 = r45039 * r45042;
        double r45044 = r45043 / r45041;
        return r45044;
}


double f_of(float x, float y, float z) {
        float r45045 = x;
        float r45046 = z;
        float r45047 = y;
        float r45048 = r45047 + r45046;
        float r45049 = r45046 / r45048;
        float r45050 = r45045 / r45049;
        return r45050;
}

double f_od(double x, double y, double z) {
        double r45051 = x;
        double r45052 = z;
        double r45053 = y;
        double r45054 = r45053 + r45052;
        double r45055 = r45052 / r45054;
        double r45056 = r45051 / r45055;
        return r45056;
}

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 r45057, r45058, r45059, r45060, r45061, r45062;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r45057);
        mpfr_init(r45058);
        mpfr_init(r45059);
        mpfr_init(r45060);
        mpfr_init(r45061);
        mpfr_init(r45062);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r45057, x, MPFR_RNDN);
        mpfr_set_d(r45058, y, MPFR_RNDN);
        mpfr_set_d(r45059, z, MPFR_RNDN);
        mpfr_add(r45060, r45058, r45059, MPFR_RNDN);
        mpfr_mul(r45061, r45057, r45060, MPFR_RNDN);
        mpfr_div(r45062, r45061, r45059, MPFR_RNDN);
        return mpfr_get_d(r45062, MPFR_RNDN);
}

static mpfr_t r45063, r45064, r45065, r45066, r45067, r45068;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r45063);
        mpfr_init(r45064);
        mpfr_init(r45065);
        mpfr_init(r45066);
        mpfr_init(r45067);
        mpfr_init(r45068);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r45063, x, MPFR_RNDN);
        mpfr_set_d(r45064, z, MPFR_RNDN);
        mpfr_set_d(r45065, y, MPFR_RNDN);
        mpfr_add(r45066, r45065, r45064, MPFR_RNDN);
        mpfr_div(r45067, r45064, r45066, MPFR_RNDN);
        mpfr_div(r45068, r45063, r45067, MPFR_RNDN);
        return mpfr_get_d(r45068, MPFR_RNDN);
}

static mpfr_t r45069, r45070, r45071, r45072, r45073, r45074;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r45069);
        mpfr_init(r45070);
        mpfr_init(r45071);
        mpfr_init(r45072);
        mpfr_init(r45073);
        mpfr_init(r45074);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r45069, x, MPFR_RNDN);
        mpfr_set_d(r45070, z, MPFR_RNDN);
        mpfr_set_d(r45071, y, MPFR_RNDN);
        mpfr_add(r45072, r45071, r45070, MPFR_RNDN);
        mpfr_div(r45073, r45070, r45072, MPFR_RNDN);
        mpfr_div(r45074, r45069, r45073, MPFR_RNDN);
        return mpfr_get_d(r45074, MPFR_RNDN);
}

