#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 r49578 = a;
        float r49579 = r49578 * r49578;
        float r49580 = b;
        float r49581 = r49580 * r49580;
        float r49582 = r49579 - r49581;
        return r49582;
}

double f_id(double a, double b) {
        double r49583 = a;
        double r49584 = r49583 * r49583;
        double r49585 = b;
        double r49586 = r49585 * r49585;
        double r49587 = r49584 - r49586;
        return r49587;
}


double f_of(float a, float b) {
        float r49588 = a;
        float r49589 = b;
        float r49590 = r49588 + r49589;
        float r49591 = r49588 - r49589;
        float r49592 = r49590 * r49591;
        return r49592;
}

double f_od(double a, double b) {
        double r49593 = a;
        double r49594 = b;
        double r49595 = r49593 + r49594;
        double r49596 = r49593 - r49594;
        double r49597 = r49595 * r49596;
        return r49597;
}

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 r49598, r49599, r49600, r49601, r49602;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r49598);
        mpfr_init(r49599);
        mpfr_init(r49600);
        mpfr_init(r49601);
        mpfr_init(r49602);
}

double f_im(double a, double b) {
        mpfr_set_d(r49598, a, MPFR_RNDN);
        mpfr_sqr(r49599, r49598, MPFR_RNDN);
        mpfr_set_d(r49600, b, MPFR_RNDN);
        mpfr_sqr(r49601, r49600, MPFR_RNDN);
        mpfr_sub(r49602, r49599, r49601, MPFR_RNDN);
        return mpfr_get_d(r49602, MPFR_RNDN);
}

static mpfr_t r49603, r49604, r49605, r49606, r49607;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r49603);
        mpfr_init(r49604);
        mpfr_init(r49605);
        mpfr_init(r49606);
        mpfr_init(r49607);
}

double f_fm(double a, double b) {
        mpfr_set_d(r49603, a, MPFR_RNDN);
        mpfr_set_d(r49604, b, MPFR_RNDN);
        mpfr_add(r49605, r49603, r49604, MPFR_RNDN);
        mpfr_sub(r49606, r49603, r49604, MPFR_RNDN);
        mpfr_mul(r49607, r49605, r49606, MPFR_RNDN);
        return mpfr_get_d(r49607, MPFR_RNDN);
}

static mpfr_t r49608, r49609, r49610, r49611, r49612;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r49608);
        mpfr_init(r49609);
        mpfr_init(r49610);
        mpfr_init(r49611);
        mpfr_init(r49612);
}

double f_dm(double a, double b) {
        mpfr_set_d(r49608, a, MPFR_RNDN);
        mpfr_set_d(r49609, b, MPFR_RNDN);
        mpfr_add(r49610, r49608, r49609, MPFR_RNDN);
        mpfr_sub(r49611, r49608, r49609, MPFR_RNDN);
        mpfr_mul(r49612, r49610, r49611, MPFR_RNDN);
        return mpfr_get_d(r49612, MPFR_RNDN);
}

