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

char *name = "Graphics.Rendering.Chart.Backend.Diagrams:calcFontMetrics from Chart-diagrams-1.5.1, A";

double f_if(float x, float y, float z) {
        float r50173 = x;
        float r50174 = y;
        float r50175 = r50173 + r50174;
        float r50176 = 1.0;
        float r50177 = z;
        float r50178 = r50174 / r50177;
        float r50179 = r50176 - r50178;
        float r50180 = r50175 / r50179;
        return r50180;
}

double f_id(double x, double y, double z) {
        double r50181 = x;
        double r50182 = y;
        double r50183 = r50181 + r50182;
        double r50184 = 1.0;
        double r50185 = z;
        double r50186 = r50182 / r50185;
        double r50187 = r50184 - r50186;
        double r50188 = r50183 / r50187;
        return r50188;
}


double f_of(float x, float y, float z) {
        float r50189 = x;
        float r50190 = y;
        float r50191 = r50189 + r50190;
        float r50192 = 1.0;
        float r50193 = z;
        float r50194 = r50190 / r50193;
        float r50195 = r50192 - r50194;
        float r50196 = r50191 / r50195;
        return r50196;
}

double f_od(double x, double y, double z) {
        double r50197 = x;
        double r50198 = y;
        double r50199 = r50197 + r50198;
        double r50200 = 1.0;
        double r50201 = z;
        double r50202 = r50198 / r50201;
        double r50203 = r50200 - r50202;
        double r50204 = r50199 / r50203;
        return r50204;
}

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 r50205, r50206, r50207, r50208, r50209, r50210, r50211, r50212;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r50205);
        mpfr_init(r50206);
        mpfr_init(r50207);
        mpfr_init_set_str(r50208, "1.0", 10, MPFR_RNDN);
        mpfr_init(r50209);
        mpfr_init(r50210);
        mpfr_init(r50211);
        mpfr_init(r50212);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r50205, x, MPFR_RNDN);
        mpfr_set_d(r50206, y, MPFR_RNDN);
        mpfr_add(r50207, r50205, r50206, MPFR_RNDN);
        ;
        mpfr_set_d(r50209, z, MPFR_RNDN);
        mpfr_div(r50210, r50206, r50209, MPFR_RNDN);
        mpfr_sub(r50211, r50208, r50210, MPFR_RNDN);
        mpfr_div(r50212, r50207, r50211, MPFR_RNDN);
        return mpfr_get_d(r50212, MPFR_RNDN);
}

static mpfr_t r50213, r50214, r50215, r50216, r50217, r50218, r50219, r50220;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50213);
        mpfr_init(r50214);
        mpfr_init(r50215);
        mpfr_init_set_str(r50216, "1.0", 10, MPFR_RNDN);
        mpfr_init(r50217);
        mpfr_init(r50218);
        mpfr_init(r50219);
        mpfr_init(r50220);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r50213, x, MPFR_RNDN);
        mpfr_set_d(r50214, y, MPFR_RNDN);
        mpfr_add(r50215, r50213, r50214, MPFR_RNDN);
        ;
        mpfr_set_d(r50217, z, MPFR_RNDN);
        mpfr_div(r50218, r50214, r50217, MPFR_RNDN);
        mpfr_sub(r50219, r50216, r50218, MPFR_RNDN);
        mpfr_div(r50220, r50215, r50219, MPFR_RNDN);
        return mpfr_get_d(r50220, MPFR_RNDN);
}

static mpfr_t r50221, r50222, r50223, r50224, r50225, r50226, r50227, r50228;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50221);
        mpfr_init(r50222);
        mpfr_init(r50223);
        mpfr_init_set_str(r50224, "1.0", 10, MPFR_RNDN);
        mpfr_init(r50225);
        mpfr_init(r50226);
        mpfr_init(r50227);
        mpfr_init(r50228);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r50221, x, MPFR_RNDN);
        mpfr_set_d(r50222, y, MPFR_RNDN);
        mpfr_add(r50223, r50221, r50222, MPFR_RNDN);
        ;
        mpfr_set_d(r50225, z, MPFR_RNDN);
        mpfr_div(r50226, r50222, r50225, MPFR_RNDN);
        mpfr_sub(r50227, r50224, r50226, MPFR_RNDN);
        mpfr_div(r50228, r50223, r50227, MPFR_RNDN);
        return mpfr_get_d(r50228, MPFR_RNDN);
}

