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

char *name = "Linear.Quaternion:$c/ from linear-1.19.1.3, D";

double f_if(float x, float y, float z) {
        float r47095 = x;
        float r47096 = y;
        float r47097 = r47095 * r47096;
        float r47098 = r47096 * r47096;
        float r47099 = r47097 - r47098;
        float r47100 = r47099 + r47098;
        float r47101 = z;
        float r47102 = r47096 * r47101;
        float r47103 = r47100 - r47102;
        return r47103;
}

double f_id(double x, double y, double z) {
        double r47104 = x;
        double r47105 = y;
        double r47106 = r47104 * r47105;
        double r47107 = r47105 * r47105;
        double r47108 = r47106 - r47107;
        double r47109 = r47108 + r47107;
        double r47110 = z;
        double r47111 = r47105 * r47110;
        double r47112 = r47109 - r47111;
        return r47112;
}


double f_of(float x, float y, float z) {
        float r47113 = x;
        float r47114 = z;
        float r47115 = r47113 - r47114;
        float r47116 = y;
        float r47117 = r47115 * r47116;
        return r47117;
}

double f_od(double x, double y, double z) {
        double r47118 = x;
        double r47119 = z;
        double r47120 = r47118 - r47119;
        double r47121 = y;
        double r47122 = r47120 * r47121;
        return r47122;
}

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 r47123, r47124, r47125, r47126, r47127, r47128, r47129, r47130, r47131;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1680);
        mpfr_init(r47123);
        mpfr_init(r47124);
        mpfr_init(r47125);
        mpfr_init(r47126);
        mpfr_init(r47127);
        mpfr_init(r47128);
        mpfr_init(r47129);
        mpfr_init(r47130);
        mpfr_init(r47131);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r47123, x, MPFR_RNDN);
        mpfr_set_d(r47124, y, MPFR_RNDN);
        mpfr_mul(r47125, r47123, r47124, MPFR_RNDN);
        mpfr_mul(r47126, r47124, r47124, MPFR_RNDN);
        mpfr_sub(r47127, r47125, r47126, MPFR_RNDN);
        mpfr_add(r47128, r47127, r47126, MPFR_RNDN);
        mpfr_set_d(r47129, z, MPFR_RNDN);
        mpfr_mul(r47130, r47124, r47129, MPFR_RNDN);
        mpfr_sub(r47131, r47128, r47130, MPFR_RNDN);
        return mpfr_get_d(r47131, MPFR_RNDN);
}

static mpfr_t r47132, r47133, r47134, r47135, r47136;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1680);
        mpfr_init(r47132);
        mpfr_init(r47133);
        mpfr_init(r47134);
        mpfr_init(r47135);
        mpfr_init(r47136);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r47132, x, MPFR_RNDN);
        mpfr_set_d(r47133, z, MPFR_RNDN);
        mpfr_sub(r47134, r47132, r47133, MPFR_RNDN);
        mpfr_set_d(r47135, y, MPFR_RNDN);
        mpfr_mul(r47136, r47134, r47135, MPFR_RNDN);
        return mpfr_get_d(r47136, MPFR_RNDN);
}

static mpfr_t r47137, r47138, r47139, r47140, r47141;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1680);
        mpfr_init(r47137);
        mpfr_init(r47138);
        mpfr_init(r47139);
        mpfr_init(r47140);
        mpfr_init(r47141);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r47137, x, MPFR_RNDN);
        mpfr_set_d(r47138, z, MPFR_RNDN);
        mpfr_sub(r47139, r47137, r47138, MPFR_RNDN);
        mpfr_set_d(r47140, y, MPFR_RNDN);
        mpfr_mul(r47141, r47139, r47140, MPFR_RNDN);
        return mpfr_get_d(r47141, MPFR_RNDN);
}

