#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 r45348 = x;
        float r45349 = y;
        float r45350 = z;
        float r45351 = r45349 + r45350;
        float r45352 = r45348 * r45351;
        float r45353 = r45352 / r45350;
        return r45353;
}

double f_id(double x, double y, double z) {
        double r45354 = x;
        double r45355 = y;
        double r45356 = z;
        double r45357 = r45355 + r45356;
        double r45358 = r45354 * r45357;
        double r45359 = r45358 / r45356;
        return r45359;
}


double f_of(float x, float y, float z) {
        float r45360 = x;
        float r45361 = z;
        float r45362 = y;
        float r45363 = r45362 + r45361;
        float r45364 = r45361 / r45363;
        float r45365 = r45360 / r45364;
        return r45365;
}

double f_od(double x, double y, double z) {
        double r45366 = x;
        double r45367 = z;
        double r45368 = y;
        double r45369 = r45368 + r45367;
        double r45370 = r45367 / r45369;
        double r45371 = r45366 / r45370;
        return r45371;
}

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 r45372, r45373, r45374, r45375, r45376, r45377;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r45372);
        mpfr_init(r45373);
        mpfr_init(r45374);
        mpfr_init(r45375);
        mpfr_init(r45376);
        mpfr_init(r45377);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r45372, x, MPFR_RNDN);
        mpfr_set_d(r45373, y, MPFR_RNDN);
        mpfr_set_d(r45374, z, MPFR_RNDN);
        mpfr_add(r45375, r45373, r45374, MPFR_RNDN);
        mpfr_mul(r45376, r45372, r45375, MPFR_RNDN);
        mpfr_div(r45377, r45376, r45374, MPFR_RNDN);
        return mpfr_get_d(r45377, MPFR_RNDN);
}

static mpfr_t r45378, r45379, r45380, r45381, r45382, r45383;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r45378);
        mpfr_init(r45379);
        mpfr_init(r45380);
        mpfr_init(r45381);
        mpfr_init(r45382);
        mpfr_init(r45383);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r45378, x, MPFR_RNDN);
        mpfr_set_d(r45379, z, MPFR_RNDN);
        mpfr_set_d(r45380, y, MPFR_RNDN);
        mpfr_add(r45381, r45380, r45379, MPFR_RNDN);
        mpfr_div(r45382, r45379, r45381, MPFR_RNDN);
        mpfr_div(r45383, r45378, r45382, MPFR_RNDN);
        return mpfr_get_d(r45383, MPFR_RNDN);
}

static mpfr_t r45384, r45385, r45386, r45387, r45388, r45389;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r45384);
        mpfr_init(r45385);
        mpfr_init(r45386);
        mpfr_init(r45387);
        mpfr_init(r45388);
        mpfr_init(r45389);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r45384, x, MPFR_RNDN);
        mpfr_set_d(r45385, z, MPFR_RNDN);
        mpfr_set_d(r45386, y, MPFR_RNDN);
        mpfr_add(r45387, r45386, r45385, MPFR_RNDN);
        mpfr_div(r45388, r45385, r45387, MPFR_RNDN);
        mpfr_div(r45389, r45384, r45388, MPFR_RNDN);
        return mpfr_get_d(r45389, MPFR_RNDN);
}

