#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, B";

double f_if(float x, float y, float z) {
        float r47221 = x;
        float r47222 = y;
        float r47223 = r47221 * r47222;
        float r47224 = z;
        float r47225 = r47222 * r47224;
        float r47226 = r47223 - r47225;
        float r47227 = r47222 * r47222;
        float r47228 = r47226 - r47227;
        float r47229 = r47228 + r47227;
        return r47229;
}

double f_id(double x, double y, double z) {
        double r47230 = x;
        double r47231 = y;
        double r47232 = r47230 * r47231;
        double r47233 = z;
        double r47234 = r47231 * r47233;
        double r47235 = r47232 - r47234;
        double r47236 = r47231 * r47231;
        double r47237 = r47235 - r47236;
        double r47238 = r47237 + r47236;
        return r47238;
}


double f_of(float x, float y, float z) {
        float r47239 = x;
        float r47240 = z;
        float r47241 = r47239 - r47240;
        float r47242 = y;
        float r47243 = r47241 * r47242;
        return r47243;
}

double f_od(double x, double y, double z) {
        double r47244 = x;
        double r47245 = z;
        double r47246 = r47244 - r47245;
        double r47247 = y;
        double r47248 = r47246 * r47247;
        return r47248;
}

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 r47249, r47250, r47251, r47252, r47253, r47254, r47255, r47256, r47257;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1680);
        mpfr_init(r47249);
        mpfr_init(r47250);
        mpfr_init(r47251);
        mpfr_init(r47252);
        mpfr_init(r47253);
        mpfr_init(r47254);
        mpfr_init(r47255);
        mpfr_init(r47256);
        mpfr_init(r47257);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r47249, x, MPFR_RNDN);
        mpfr_set_d(r47250, y, MPFR_RNDN);
        mpfr_mul(r47251, r47249, r47250, MPFR_RNDN);
        mpfr_set_d(r47252, z, MPFR_RNDN);
        mpfr_mul(r47253, r47250, r47252, MPFR_RNDN);
        mpfr_sub(r47254, r47251, r47253, MPFR_RNDN);
        mpfr_mul(r47255, r47250, r47250, MPFR_RNDN);
        mpfr_sub(r47256, r47254, r47255, MPFR_RNDN);
        mpfr_add(r47257, r47256, r47255, MPFR_RNDN);
        return mpfr_get_d(r47257, MPFR_RNDN);
}

static mpfr_t r47258, r47259, r47260, r47261, r47262;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1680);
        mpfr_init(r47258);
        mpfr_init(r47259);
        mpfr_init(r47260);
        mpfr_init(r47261);
        mpfr_init(r47262);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r47258, x, MPFR_RNDN);
        mpfr_set_d(r47259, z, MPFR_RNDN);
        mpfr_sub(r47260, r47258, r47259, MPFR_RNDN);
        mpfr_set_d(r47261, y, MPFR_RNDN);
        mpfr_mul(r47262, r47260, r47261, MPFR_RNDN);
        return mpfr_get_d(r47262, MPFR_RNDN);
}

static mpfr_t r47263, r47264, r47265, r47266, r47267;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1680);
        mpfr_init(r47263);
        mpfr_init(r47264);
        mpfr_init(r47265);
        mpfr_init(r47266);
        mpfr_init(r47267);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r47263, x, MPFR_RNDN);
        mpfr_set_d(r47264, z, MPFR_RNDN);
        mpfr_sub(r47265, r47263, r47264, MPFR_RNDN);
        mpfr_set_d(r47266, y, MPFR_RNDN);
        mpfr_mul(r47267, r47265, r47266, MPFR_RNDN);
        return mpfr_get_d(r47267, MPFR_RNDN);
}

