#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 r47567 = x;
        float r47568 = y;
        float r47569 = r47567 * r47568;
        float r47570 = r47568 * r47568;
        float r47571 = r47569 - r47570;
        float r47572 = r47571 + r47570;
        float r47573 = z;
        float r47574 = r47568 * r47573;
        float r47575 = r47572 - r47574;
        return r47575;
}

double f_id(double x, double y, double z) {
        double r47576 = x;
        double r47577 = y;
        double r47578 = r47576 * r47577;
        double r47579 = r47577 * r47577;
        double r47580 = r47578 - r47579;
        double r47581 = r47580 + r47579;
        double r47582 = z;
        double r47583 = r47577 * r47582;
        double r47584 = r47581 - r47583;
        return r47584;
}


double f_of(float x, float y, float z) {
        float r47585 = x;
        float r47586 = z;
        float r47587 = r47585 - r47586;
        float r47588 = y;
        float r47589 = r47587 * r47588;
        return r47589;
}

double f_od(double x, double y, double z) {
        double r47590 = x;
        double r47591 = z;
        double r47592 = r47590 - r47591;
        double r47593 = y;
        double r47594 = r47592 * r47593;
        return r47594;
}

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 r47595, r47596, r47597, r47598, r47599, r47600, r47601, r47602, r47603;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1680);
        mpfr_init(r47595);
        mpfr_init(r47596);
        mpfr_init(r47597);
        mpfr_init(r47598);
        mpfr_init(r47599);
        mpfr_init(r47600);
        mpfr_init(r47601);
        mpfr_init(r47602);
        mpfr_init(r47603);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r47595, x, MPFR_RNDN);
        mpfr_set_d(r47596, y, MPFR_RNDN);
        mpfr_mul(r47597, r47595, r47596, MPFR_RNDN);
        mpfr_mul(r47598, r47596, r47596, MPFR_RNDN);
        mpfr_sub(r47599, r47597, r47598, MPFR_RNDN);
        mpfr_add(r47600, r47599, r47598, MPFR_RNDN);
        mpfr_set_d(r47601, z, MPFR_RNDN);
        mpfr_mul(r47602, r47596, r47601, MPFR_RNDN);
        mpfr_sub(r47603, r47600, r47602, MPFR_RNDN);
        return mpfr_get_d(r47603, MPFR_RNDN);
}

static mpfr_t r47604, r47605, r47606, r47607, r47608;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1680);
        mpfr_init(r47604);
        mpfr_init(r47605);
        mpfr_init(r47606);
        mpfr_init(r47607);
        mpfr_init(r47608);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r47604, x, MPFR_RNDN);
        mpfr_set_d(r47605, z, MPFR_RNDN);
        mpfr_sub(r47606, r47604, r47605, MPFR_RNDN);
        mpfr_set_d(r47607, y, MPFR_RNDN);
        mpfr_mul(r47608, r47606, r47607, MPFR_RNDN);
        return mpfr_get_d(r47608, MPFR_RNDN);
}

static mpfr_t r47609, r47610, r47611, r47612, r47613;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1680);
        mpfr_init(r47609);
        mpfr_init(r47610);
        mpfr_init(r47611);
        mpfr_init(r47612);
        mpfr_init(r47613);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r47609, x, MPFR_RNDN);
        mpfr_set_d(r47610, z, MPFR_RNDN);
        mpfr_sub(r47611, r47609, r47610, MPFR_RNDN);
        mpfr_set_d(r47612, y, MPFR_RNDN);
        mpfr_mul(r47613, r47611, r47612, MPFR_RNDN);
        return mpfr_get_d(r47613, MPFR_RNDN);
}

