#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 r45321 = x;
        float r45322 = y;
        float r45323 = z;
        float r45324 = r45322 + r45323;
        float r45325 = r45321 * r45324;
        float r45326 = r45325 / r45323;
        return r45326;
}

double f_id(double x, double y, double z) {
        double r45327 = x;
        double r45328 = y;
        double r45329 = z;
        double r45330 = r45328 + r45329;
        double r45331 = r45327 * r45330;
        double r45332 = r45331 / r45329;
        return r45332;
}


double f_of(float x, float y, float z) {
        float r45333 = x;
        float r45334 = z;
        float r45335 = y;
        float r45336 = r45335 + r45334;
        float r45337 = r45334 / r45336;
        float r45338 = r45333 / r45337;
        return r45338;
}

double f_od(double x, double y, double z) {
        double r45339 = x;
        double r45340 = z;
        double r45341 = y;
        double r45342 = r45341 + r45340;
        double r45343 = r45340 / r45342;
        double r45344 = r45339 / r45343;
        return r45344;
}

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 r45345, r45346, r45347, r45348, r45349, r45350;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r45345);
        mpfr_init(r45346);
        mpfr_init(r45347);
        mpfr_init(r45348);
        mpfr_init(r45349);
        mpfr_init(r45350);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r45345, x, MPFR_RNDN);
        mpfr_set_d(r45346, y, MPFR_RNDN);
        mpfr_set_d(r45347, z, MPFR_RNDN);
        mpfr_add(r45348, r45346, r45347, MPFR_RNDN);
        mpfr_mul(r45349, r45345, r45348, MPFR_RNDN);
        mpfr_div(r45350, r45349, r45347, MPFR_RNDN);
        return mpfr_get_d(r45350, MPFR_RNDN);
}

static mpfr_t r45351, r45352, r45353, r45354, r45355, r45356;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r45351);
        mpfr_init(r45352);
        mpfr_init(r45353);
        mpfr_init(r45354);
        mpfr_init(r45355);
        mpfr_init(r45356);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r45351, x, MPFR_RNDN);
        mpfr_set_d(r45352, z, MPFR_RNDN);
        mpfr_set_d(r45353, y, MPFR_RNDN);
        mpfr_add(r45354, r45353, r45352, MPFR_RNDN);
        mpfr_div(r45355, r45352, r45354, MPFR_RNDN);
        mpfr_div(r45356, r45351, r45355, MPFR_RNDN);
        return mpfr_get_d(r45356, MPFR_RNDN);
}

static mpfr_t r45357, r45358, r45359, r45360, r45361, r45362;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r45357);
        mpfr_init(r45358);
        mpfr_init(r45359);
        mpfr_init(r45360);
        mpfr_init(r45361);
        mpfr_init(r45362);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r45357, x, MPFR_RNDN);
        mpfr_set_d(r45358, z, MPFR_RNDN);
        mpfr_set_d(r45359, y, MPFR_RNDN);
        mpfr_add(r45360, r45359, r45358, MPFR_RNDN);
        mpfr_div(r45361, r45358, r45360, MPFR_RNDN);
        mpfr_div(r45362, r45357, r45361, MPFR_RNDN);
        return mpfr_get_d(r45362, MPFR_RNDN);
}

