#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 r23322 = a;
        float r23323 = r23322 * r23322;
        float r23324 = b;
        float r23325 = r23324 * r23324;
        float r23326 = r23323 - r23325;
        return r23326;
}

double f_id(double a, double b) {
        double r23327 = a;
        double r23328 = r23327 * r23327;
        double r23329 = b;
        double r23330 = r23329 * r23329;
        double r23331 = r23328 - r23330;
        return r23331;
}


double f_of(float a, float b) {
        float r23332 = a;
        float r23333 = b;
        float r23334 = r23332 + r23333;
        float r23335 = r23332 - r23333;
        float r23336 = r23334 * r23335;
        return r23336;
}

double f_od(double a, double b) {
        double r23337 = a;
        double r23338 = b;
        double r23339 = r23337 + r23338;
        double r23340 = r23337 - r23338;
        double r23341 = r23339 * r23340;
        return r23341;
}

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 r23342, r23343, r23344, r23345, r23346;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r23342);
        mpfr_init(r23343);
        mpfr_init(r23344);
        mpfr_init(r23345);
        mpfr_init(r23346);
}

double f_im(double a, double b) {
        mpfr_set_d(r23342, a, MPFR_RNDN);
        mpfr_mul(r23343, r23342, r23342, MPFR_RNDN);
        mpfr_set_d(r23344, b, MPFR_RNDN);
        mpfr_mul(r23345, r23344, r23344, MPFR_RNDN);
        mpfr_sub(r23346, r23343, r23345, MPFR_RNDN);
        return mpfr_get_d(r23346, MPFR_RNDN);
}

static mpfr_t r23347, r23348, r23349, r23350, r23351;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r23347);
        mpfr_init(r23348);
        mpfr_init(r23349);
        mpfr_init(r23350);
        mpfr_init(r23351);
}

double f_fm(double a, double b) {
        mpfr_set_d(r23347, a, MPFR_RNDN);
        mpfr_set_d(r23348, b, MPFR_RNDN);
        mpfr_add(r23349, r23347, r23348, MPFR_RNDN);
        mpfr_sub(r23350, r23347, r23348, MPFR_RNDN);
        mpfr_mul(r23351, r23349, r23350, MPFR_RNDN);
        return mpfr_get_d(r23351, MPFR_RNDN);
}

static mpfr_t r23352, r23353, r23354, r23355, r23356;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r23352);
        mpfr_init(r23353);
        mpfr_init(r23354);
        mpfr_init(r23355);
        mpfr_init(r23356);
}

double f_dm(double a, double b) {
        mpfr_set_d(r23352, a, MPFR_RNDN);
        mpfr_set_d(r23353, b, MPFR_RNDN);
        mpfr_add(r23354, r23352, r23353, MPFR_RNDN);
        mpfr_sub(r23355, r23352, r23353, MPFR_RNDN);
        mpfr_mul(r23356, r23354, r23355, MPFR_RNDN);
        return mpfr_get_d(r23356, MPFR_RNDN);
}

