#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 r9976 = a;
        float r9977 = r9976 * r9976;
        float r9978 = b;
        float r9979 = r9978 * r9978;
        float r9980 = r9977 - r9979;
        return r9980;
}

double f_id(double a, double b) {
        double r9981 = a;
        double r9982 = r9981 * r9981;
        double r9983 = b;
        double r9984 = r9983 * r9983;
        double r9985 = r9982 - r9984;
        return r9985;
}


double f_of(float a, float b) {
        float r9986 = a;
        float r9987 = b;
        float r9988 = r9986 + r9987;
        float r9989 = r9986 - r9987;
        float r9990 = r9988 * r9989;
        return r9990;
}

double f_od(double a, double b) {
        double r9991 = a;
        double r9992 = b;
        double r9993 = r9991 + r9992;
        double r9994 = r9991 - r9992;
        double r9995 = r9993 * r9994;
        return r9995;
}

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 r9996, r9997, r9998, r9999, r10000;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r9996);
        mpfr_init(r9997);
        mpfr_init(r9998);
        mpfr_init(r9999);
        mpfr_init(r10000);
}

double f_im(double a, double b) {
        mpfr_set_d(r9996, a, MPFR_RNDN);
        mpfr_mul(r9997, r9996, r9996, MPFR_RNDN);
        mpfr_set_d(r9998, b, MPFR_RNDN);
        mpfr_mul(r9999, r9998, r9998, MPFR_RNDN);
        mpfr_sub(r10000, r9997, r9999, MPFR_RNDN);
        return mpfr_get_d(r10000, MPFR_RNDN);
}

static mpfr_t r10001, r10002, r10003, r10004, r10005;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r10001);
        mpfr_init(r10002);
        mpfr_init(r10003);
        mpfr_init(r10004);
        mpfr_init(r10005);
}

double f_fm(double a, double b) {
        mpfr_set_d(r10001, a, MPFR_RNDN);
        mpfr_set_d(r10002, b, MPFR_RNDN);
        mpfr_add(r10003, r10001, r10002, MPFR_RNDN);
        mpfr_sub(r10004, r10001, r10002, MPFR_RNDN);
        mpfr_mul(r10005, r10003, r10004, MPFR_RNDN);
        return mpfr_get_d(r10005, MPFR_RNDN);
}

static mpfr_t r10006, r10007, r10008, r10009, r10010;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r10006);
        mpfr_init(r10007);
        mpfr_init(r10008);
        mpfr_init(r10009);
        mpfr_init(r10010);
}

double f_dm(double a, double b) {
        mpfr_set_d(r10006, a, MPFR_RNDN);
        mpfr_set_d(r10007, b, MPFR_RNDN);
        mpfr_add(r10008, r10006, r10007, MPFR_RNDN);
        mpfr_sub(r10009, r10006, r10007, MPFR_RNDN);
        mpfr_mul(r10010, r10008, r10009, MPFR_RNDN);
        return mpfr_get_d(r10010, MPFR_RNDN);
}

