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

char *name = "Graphics.Rasterific.QuadraticFormula:discriminant from Rasterific-0.6.1";

double f_if(float x, float y, float z) {
        float r32536 = x;
        float r32537 = r32536 * r32536;
        float r32538 = y;
        float r32539 = 4.0;
        float r32540 = r32538 * r32539;
        float r32541 = z;
        float r32542 = r32540 * r32541;
        float r32543 = r32537 - r32542;
        return r32543;
}

double f_id(double x, double y, double z) {
        double r32544 = x;
        double r32545 = r32544 * r32544;
        double r32546 = y;
        double r32547 = 4.0;
        double r32548 = r32546 * r32547;
        double r32549 = z;
        double r32550 = r32548 * r32549;
        double r32551 = r32545 - r32550;
        return r32551;
}


double f_of(float x, float y, float z) {
        float r32552 = x;
        float r32553 = r32552 * r32552;
        float r32554 = y;
        float r32555 = 4.0;
        float r32556 = r32554 * r32555;
        float r32557 = z;
        float r32558 = r32556 * r32557;
        float r32559 = r32553 - r32558;
        return r32559;
}

double f_od(double x, double y, double z) {
        double r32560 = x;
        double r32561 = r32560 * r32560;
        double r32562 = y;
        double r32563 = 4.0;
        double r32564 = r32562 * r32563;
        double r32565 = z;
        double r32566 = r32564 * r32565;
        double r32567 = r32561 - r32566;
        return r32567;
}

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 r32568, r32569, r32570, r32571, r32572, r32573, r32574, r32575;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r32568);
        mpfr_init(r32569);
        mpfr_init(r32570);
        mpfr_init_set_str(r32571, "4.0", 10, MPFR_RNDN);
        mpfr_init(r32572);
        mpfr_init(r32573);
        mpfr_init(r32574);
        mpfr_init(r32575);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r32568, x, MPFR_RNDN);
        mpfr_mul(r32569, r32568, r32568, MPFR_RNDN);
        mpfr_set_d(r32570, y, MPFR_RNDN);
        ;
        mpfr_mul(r32572, r32570, r32571, MPFR_RNDN);
        mpfr_set_d(r32573, z, MPFR_RNDN);
        mpfr_mul(r32574, r32572, r32573, MPFR_RNDN);
        mpfr_sub(r32575, r32569, r32574, MPFR_RNDN);
        return mpfr_get_d(r32575, MPFR_RNDN);
}

static mpfr_t r32576, r32577, r32578, r32579, r32580, r32581, r32582, r32583;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r32576);
        mpfr_init(r32577);
        mpfr_init(r32578);
        mpfr_init_set_str(r32579, "4.0", 10, MPFR_RNDN);
        mpfr_init(r32580);
        mpfr_init(r32581);
        mpfr_init(r32582);
        mpfr_init(r32583);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r32576, x, MPFR_RNDN);
        mpfr_mul(r32577, r32576, r32576, MPFR_RNDN);
        mpfr_set_d(r32578, y, MPFR_RNDN);
        ;
        mpfr_mul(r32580, r32578, r32579, MPFR_RNDN);
        mpfr_set_d(r32581, z, MPFR_RNDN);
        mpfr_mul(r32582, r32580, r32581, MPFR_RNDN);
        mpfr_sub(r32583, r32577, r32582, MPFR_RNDN);
        return mpfr_get_d(r32583, MPFR_RNDN);
}

static mpfr_t r32584, r32585, r32586, r32587, r32588, r32589, r32590, r32591;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r32584);
        mpfr_init(r32585);
        mpfr_init(r32586);
        mpfr_init_set_str(r32587, "4.0", 10, MPFR_RNDN);
        mpfr_init(r32588);
        mpfr_init(r32589);
        mpfr_init(r32590);
        mpfr_init(r32591);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r32584, x, MPFR_RNDN);
        mpfr_mul(r32585, r32584, r32584, MPFR_RNDN);
        mpfr_set_d(r32586, y, MPFR_RNDN);
        ;
        mpfr_mul(r32588, r32586, r32587, MPFR_RNDN);
        mpfr_set_d(r32589, z, MPFR_RNDN);
        mpfr_mul(r32590, r32588, r32589, MPFR_RNDN);
        mpfr_sub(r32591, r32585, r32590, MPFR_RNDN);
        return mpfr_get_d(r32591, MPFR_RNDN);
}

