#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 r50860 = x;
        float r50861 = y;
        float r50862 = r50860 - r50861;
        float r50863 = z;
        float r50864 = r50863 - r50861;
        float r50865 = r50862 / r50864;
        return r50865;
}

double f_id(double x, double y, double z) {
        double r50866 = x;
        double r50867 = y;
        double r50868 = r50866 - r50867;
        double r50869 = z;
        double r50870 = r50869 - r50867;
        double r50871 = r50868 / r50870;
        return r50871;
}


double f_of(float x, float y, float z) {
        float r50872 = x;
        float r50873 = y;
        float r50874 = r50872 - r50873;
        float r50875 = z;
        float r50876 = r50875 - r50873;
        float r50877 = r50874 / r50876;
        return r50877;
}

double f_od(double x, double y, double z) {
        double r50878 = x;
        double r50879 = y;
        double r50880 = r50878 - r50879;
        double r50881 = z;
        double r50882 = r50881 - r50879;
        double r50883 = r50880 / r50882;
        return r50883;
}

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 r50884, r50885, r50886, r50887, r50888, r50889;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r50884);
        mpfr_init(r50885);
        mpfr_init(r50886);
        mpfr_init(r50887);
        mpfr_init(r50888);
        mpfr_init(r50889);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r50884, x, MPFR_RNDN);
        mpfr_set_d(r50885, y, MPFR_RNDN);
        mpfr_sub(r50886, r50884, r50885, MPFR_RNDN);
        mpfr_set_d(r50887, z, MPFR_RNDN);
        mpfr_sub(r50888, r50887, r50885, MPFR_RNDN);
        mpfr_div(r50889, r50886, r50888, MPFR_RNDN);
        return mpfr_get_d(r50889, MPFR_RNDN);
}

static mpfr_t r50890, r50891, r50892, r50893, r50894, r50895;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50890);
        mpfr_init(r50891);
        mpfr_init(r50892);
        mpfr_init(r50893);
        mpfr_init(r50894);
        mpfr_init(r50895);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r50890, x, MPFR_RNDN);
        mpfr_set_d(r50891, y, MPFR_RNDN);
        mpfr_sub(r50892, r50890, r50891, MPFR_RNDN);
        mpfr_set_d(r50893, z, MPFR_RNDN);
        mpfr_sub(r50894, r50893, r50891, MPFR_RNDN);
        mpfr_div(r50895, r50892, r50894, MPFR_RNDN);
        return mpfr_get_d(r50895, MPFR_RNDN);
}

static mpfr_t r50896, r50897, r50898, r50899, r50900, r50901;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r50896);
        mpfr_init(r50897);
        mpfr_init(r50898);
        mpfr_init(r50899);
        mpfr_init(r50900);
        mpfr_init(r50901);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r50896, x, MPFR_RNDN);
        mpfr_set_d(r50897, y, MPFR_RNDN);
        mpfr_sub(r50898, r50896, r50897, MPFR_RNDN);
        mpfr_set_d(r50899, z, MPFR_RNDN);
        mpfr_sub(r50900, r50899, r50897, MPFR_RNDN);
        mpfr_div(r50901, r50898, r50900, MPFR_RNDN);
        return mpfr_get_d(r50901, MPFR_RNDN);
}

