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

char *name = "Graphics.Rasterific.Shading:$sgradientColorAt from Rasterific-0.6.1";

double f_if(float x, float y, float z) {
        float r50954 = x;
        float r50955 = y;
        float r50956 = r50954 - r50955;
        float r50957 = z;
        float r50958 = r50957 - r50955;
        float r50959 = r50956 / r50958;
        return r50959;
}

double f_id(double x, double y, double z) {
        double r50960 = x;
        double r50961 = y;
        double r50962 = r50960 - r50961;
        double r50963 = z;
        double r50964 = r50963 - r50961;
        double r50965 = r50962 / r50964;
        return r50965;
}


double f_of(float x, float y, float z) {
        float r50966 = x;
        float r50967 = y;
        float r50968 = r50966 - r50967;
        float r50969 = z;
        float r50970 = r50969 - r50967;
        float r50971 = r50968 / r50970;
        return r50971;
}

double f_od(double x, double y, double z) {
        double r50972 = x;
        double r50973 = y;
        double r50974 = r50972 - r50973;
        double r50975 = z;
        double r50976 = r50975 - r50973;
        double r50977 = r50974 / r50976;
        return r50977;
}

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 r50978, r50979, r50980, r50981, r50982, r50983;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r50978);
        mpfr_init(r50979);
        mpfr_init(r50980);
        mpfr_init(r50981);
        mpfr_init(r50982);
        mpfr_init(r50983);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r50978, x, MPFR_RNDN);
        mpfr_set_d(r50979, y, MPFR_RNDN);
        mpfr_sub(r50980, r50978, r50979, MPFR_RNDN);
        mpfr_set_d(r50981, z, MPFR_RNDN);
        mpfr_sub(r50982, r50981, r50979, MPFR_RNDN);
        mpfr_div(r50983, r50980, r50982, MPFR_RNDN);
        return mpfr_get_d(r50983, MPFR_RNDN);
}

static mpfr_t r50984, r50985, r50986, r50987, r50988, r50989;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50984);
        mpfr_init(r50985);
        mpfr_init(r50986);
        mpfr_init(r50987);
        mpfr_init(r50988);
        mpfr_init(r50989);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r50984, x, MPFR_RNDN);
        mpfr_set_d(r50985, y, MPFR_RNDN);
        mpfr_sub(r50986, r50984, r50985, MPFR_RNDN);
        mpfr_set_d(r50987, z, MPFR_RNDN);
        mpfr_sub(r50988, r50987, r50985, MPFR_RNDN);
        mpfr_div(r50989, r50986, r50988, MPFR_RNDN);
        return mpfr_get_d(r50989, MPFR_RNDN);
}

static mpfr_t r50990, r50991, r50992, r50993, r50994, r50995;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50990);
        mpfr_init(r50991);
        mpfr_init(r50992);
        mpfr_init(r50993);
        mpfr_init(r50994);
        mpfr_init(r50995);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r50990, x, MPFR_RNDN);
        mpfr_set_d(r50991, y, MPFR_RNDN);
        mpfr_sub(r50992, r50990, r50991, MPFR_RNDN);
        mpfr_set_d(r50993, z, MPFR_RNDN);
        mpfr_sub(r50994, r50993, r50991, MPFR_RNDN);
        mpfr_div(r50995, r50992, r50994, MPFR_RNDN);
        return mpfr_get_d(r50995, MPFR_RNDN);
}

