#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 r50117 = x;
        float r50118 = y;
        float r50119 = r50117 + r50118;
        float r50120 = 1.0;
        float r50121 = z;
        float r50122 = r50118 / r50121;
        float r50123 = r50120 - r50122;
        float r50124 = r50119 / r50123;
        return r50124;
}

double f_id(double x, double y, double z) {
        double r50125 = x;
        double r50126 = y;
        double r50127 = r50125 + r50126;
        double r50128 = 1.0;
        double r50129 = z;
        double r50130 = r50126 / r50129;
        double r50131 = r50128 - r50130;
        double r50132 = r50127 / r50131;
        return r50132;
}


double f_of(float x, float y, float z) {
        float r50133 = x;
        float r50134 = y;
        float r50135 = r50133 + r50134;
        float r50136 = 1.0;
        float r50137 = z;
        float r50138 = r50134 / r50137;
        float r50139 = r50136 - r50138;
        float r50140 = r50135 / r50139;
        return r50140;
}

double f_od(double x, double y, double z) {
        double r50141 = x;
        double r50142 = y;
        double r50143 = r50141 + r50142;
        double r50144 = 1.0;
        double r50145 = z;
        double r50146 = r50142 / r50145;
        double r50147 = r50144 - r50146;
        double r50148 = r50143 / r50147;
        return r50148;
}

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 r50149, r50150, r50151, r50152, r50153, r50154, r50155, r50156;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r50149);
        mpfr_init(r50150);
        mpfr_init(r50151);
        mpfr_init_set_str(r50152, "1.0", 10, MPFR_RNDN);
        mpfr_init(r50153);
        mpfr_init(r50154);
        mpfr_init(r50155);
        mpfr_init(r50156);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r50149, x, MPFR_RNDN);
        mpfr_set_d(r50150, y, MPFR_RNDN);
        mpfr_add(r50151, r50149, r50150, MPFR_RNDN);
        ;
        mpfr_set_d(r50153, z, MPFR_RNDN);
        mpfr_div(r50154, r50150, r50153, MPFR_RNDN);
        mpfr_sub(r50155, r50152, r50154, MPFR_RNDN);
        mpfr_div(r50156, r50151, r50155, MPFR_RNDN);
        return mpfr_get_d(r50156, MPFR_RNDN);
}

static mpfr_t r50157, r50158, r50159, r50160, r50161, r50162, r50163, r50164;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50157);
        mpfr_init(r50158);
        mpfr_init(r50159);
        mpfr_init_set_str(r50160, "1.0", 10, MPFR_RNDN);
        mpfr_init(r50161);
        mpfr_init(r50162);
        mpfr_init(r50163);
        mpfr_init(r50164);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r50157, x, MPFR_RNDN);
        mpfr_set_d(r50158, y, MPFR_RNDN);
        mpfr_add(r50159, r50157, r50158, MPFR_RNDN);
        ;
        mpfr_set_d(r50161, z, MPFR_RNDN);
        mpfr_div(r50162, r50158, r50161, MPFR_RNDN);
        mpfr_sub(r50163, r50160, r50162, MPFR_RNDN);
        mpfr_div(r50164, r50159, r50163, MPFR_RNDN);
        return mpfr_get_d(r50164, MPFR_RNDN);
}

static mpfr_t r50165, r50166, r50167, r50168, r50169, r50170, r50171, r50172;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50165);
        mpfr_init(r50166);
        mpfr_init(r50167);
        mpfr_init_set_str(r50168, "1.0", 10, MPFR_RNDN);
        mpfr_init(r50169);
        mpfr_init(r50170);
        mpfr_init(r50171);
        mpfr_init(r50172);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r50165, x, MPFR_RNDN);
        mpfr_set_d(r50166, y, MPFR_RNDN);
        mpfr_add(r50167, r50165, r50166, MPFR_RNDN);
        ;
        mpfr_set_d(r50169, z, MPFR_RNDN);
        mpfr_div(r50170, r50166, r50169, MPFR_RNDN);
        mpfr_sub(r50171, r50168, r50170, MPFR_RNDN);
        mpfr_div(r50172, r50167, r50171, MPFR_RNDN);
        return mpfr_get_d(r50172, MPFR_RNDN);
}

