#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 r50405 = x;
        float r50406 = y;
        float r50407 = r50405 + r50406;
        float r50408 = 1.0;
        float r50409 = z;
        float r50410 = r50406 / r50409;
        float r50411 = r50408 - r50410;
        float r50412 = r50407 / r50411;
        return r50412;
}

double f_id(double x, double y, double z) {
        double r50413 = x;
        double r50414 = y;
        double r50415 = r50413 + r50414;
        double r50416 = 1.0;
        double r50417 = z;
        double r50418 = r50414 / r50417;
        double r50419 = r50416 - r50418;
        double r50420 = r50415 / r50419;
        return r50420;
}


double f_of(float x, float y, float z) {
        float r50421 = x;
        float r50422 = y;
        float r50423 = r50421 + r50422;
        float r50424 = 1.0;
        float r50425 = z;
        float r50426 = r50422 / r50425;
        float r50427 = r50424 - r50426;
        float r50428 = r50423 / r50427;
        return r50428;
}

double f_od(double x, double y, double z) {
        double r50429 = x;
        double r50430 = y;
        double r50431 = r50429 + r50430;
        double r50432 = 1.0;
        double r50433 = z;
        double r50434 = r50430 / r50433;
        double r50435 = r50432 - r50434;
        double r50436 = r50431 / r50435;
        return r50436;
}

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 r50437, r50438, r50439, r50440, r50441, r50442, r50443, r50444;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r50437);
        mpfr_init(r50438);
        mpfr_init(r50439);
        mpfr_init_set_str(r50440, "1.0", 10, MPFR_RNDN);
        mpfr_init(r50441);
        mpfr_init(r50442);
        mpfr_init(r50443);
        mpfr_init(r50444);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r50437, x, MPFR_RNDN);
        mpfr_set_d(r50438, y, MPFR_RNDN);
        mpfr_add(r50439, r50437, r50438, MPFR_RNDN);
        ;
        mpfr_set_d(r50441, z, MPFR_RNDN);
        mpfr_div(r50442, r50438, r50441, MPFR_RNDN);
        mpfr_sub(r50443, r50440, r50442, MPFR_RNDN);
        mpfr_div(r50444, r50439, r50443, MPFR_RNDN);
        return mpfr_get_d(r50444, MPFR_RNDN);
}

static mpfr_t r50445, r50446, r50447, r50448, r50449, r50450, r50451, r50452;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50445);
        mpfr_init(r50446);
        mpfr_init(r50447);
        mpfr_init_set_str(r50448, "1.0", 10, MPFR_RNDN);
        mpfr_init(r50449);
        mpfr_init(r50450);
        mpfr_init(r50451);
        mpfr_init(r50452);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r50445, x, MPFR_RNDN);
        mpfr_set_d(r50446, y, MPFR_RNDN);
        mpfr_add(r50447, r50445, r50446, MPFR_RNDN);
        ;
        mpfr_set_d(r50449, z, MPFR_RNDN);
        mpfr_div(r50450, r50446, r50449, MPFR_RNDN);
        mpfr_sub(r50451, r50448, r50450, MPFR_RNDN);
        mpfr_div(r50452, r50447, r50451, MPFR_RNDN);
        return mpfr_get_d(r50452, MPFR_RNDN);
}

static mpfr_t r50453, r50454, r50455, r50456, r50457, r50458, r50459, r50460;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50453);
        mpfr_init(r50454);
        mpfr_init(r50455);
        mpfr_init_set_str(r50456, "1.0", 10, MPFR_RNDN);
        mpfr_init(r50457);
        mpfr_init(r50458);
        mpfr_init(r50459);
        mpfr_init(r50460);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r50453, x, MPFR_RNDN);
        mpfr_set_d(r50454, y, MPFR_RNDN);
        mpfr_add(r50455, r50453, r50454, MPFR_RNDN);
        ;
        mpfr_set_d(r50457, z, MPFR_RNDN);
        mpfr_div(r50458, r50454, r50457, MPFR_RNDN);
        mpfr_sub(r50459, r50456, r50458, MPFR_RNDN);
        mpfr_div(r50460, r50455, r50459, MPFR_RNDN);
        return mpfr_get_d(r50460, MPFR_RNDN);
}

