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

char *name = "Difference of squares";

double f_if(float a, float b) {
        float r16609 = a;
        float r16610 = r16609 * r16609;
        float r16611 = b;
        float r16612 = r16611 * r16611;
        float r16613 = r16610 - r16612;
        return r16613;
}

double f_id(double a, double b) {
        double r16614 = a;
        double r16615 = r16614 * r16614;
        double r16616 = b;
        double r16617 = r16616 * r16616;
        double r16618 = r16615 - r16617;
        return r16618;
}


double f_of(float a, float b) {
        float r16619 = a;
        float r16620 = b;
        float r16621 = r16619 + r16620;
        float r16622 = r16619 - r16620;
        float r16623 = r16621 * r16622;
        return r16623;
}

double f_od(double a, double b) {
        double r16624 = a;
        double r16625 = b;
        double r16626 = r16624 + r16625;
        double r16627 = r16624 - r16625;
        double r16628 = r16626 * r16627;
        return r16628;
}

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 r16629, r16630, r16631, r16632, r16633;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r16629);
        mpfr_init(r16630);
        mpfr_init(r16631);
        mpfr_init(r16632);
        mpfr_init(r16633);
}

double f_im(double a, double b) {
        mpfr_set_d(r16629, a, MPFR_RNDN);
        mpfr_sqr(r16630, r16629, MPFR_RNDN);
        mpfr_set_d(r16631, b, MPFR_RNDN);
        mpfr_sqr(r16632, r16631, MPFR_RNDN);
        mpfr_sub(r16633, r16630, r16632, MPFR_RNDN);
        return mpfr_get_d(r16633, MPFR_RNDN);
}

static mpfr_t r16634, r16635, r16636, r16637, r16638;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r16634);
        mpfr_init(r16635);
        mpfr_init(r16636);
        mpfr_init(r16637);
        mpfr_init(r16638);
}

double f_fm(double a, double b) {
        mpfr_set_d(r16634, a, MPFR_RNDN);
        mpfr_set_d(r16635, b, MPFR_RNDN);
        mpfr_add(r16636, r16634, r16635, MPFR_RNDN);
        mpfr_sub(r16637, r16634, r16635, MPFR_RNDN);
        mpfr_mul(r16638, r16636, r16637, MPFR_RNDN);
        return mpfr_get_d(r16638, MPFR_RNDN);
}

static mpfr_t r16639, r16640, r16641, r16642, r16643;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r16639);
        mpfr_init(r16640);
        mpfr_init(r16641);
        mpfr_init(r16642);
        mpfr_init(r16643);
}

double f_dm(double a, double b) {
        mpfr_set_d(r16639, a, MPFR_RNDN);
        mpfr_set_d(r16640, b, MPFR_RNDN);
        mpfr_add(r16641, r16639, r16640, MPFR_RNDN);
        mpfr_sub(r16642, r16639, r16640, MPFR_RNDN);
        mpfr_mul(r16643, r16641, r16642, MPFR_RNDN);
        return mpfr_get_d(r16643, MPFR_RNDN);
}

