#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 r23378 = a;
        float r23379 = r23378 * r23378;
        float r23380 = b;
        float r23381 = r23380 * r23380;
        float r23382 = r23379 - r23381;
        return r23382;
}

double f_id(double a, double b) {
        double r23383 = a;
        double r23384 = r23383 * r23383;
        double r23385 = b;
        double r23386 = r23385 * r23385;
        double r23387 = r23384 - r23386;
        return r23387;
}


double f_of(float a, float b) {
        float r23388 = a;
        float r23389 = b;
        float r23390 = r23388 + r23389;
        float r23391 = r23388 - r23389;
        float r23392 = r23390 * r23391;
        return r23392;
}

double f_od(double a, double b) {
        double r23393 = a;
        double r23394 = b;
        double r23395 = r23393 + r23394;
        double r23396 = r23393 - r23394;
        double r23397 = r23395 * r23396;
        return r23397;
}

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 r23398, r23399, r23400, r23401, r23402;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r23398);
        mpfr_init(r23399);
        mpfr_init(r23400);
        mpfr_init(r23401);
        mpfr_init(r23402);
}

double f_im(double a, double b) {
        mpfr_set_d(r23398, a, MPFR_RNDN);
        mpfr_mul(r23399, r23398, r23398, MPFR_RNDN);
        mpfr_set_d(r23400, b, MPFR_RNDN);
        mpfr_mul(r23401, r23400, r23400, MPFR_RNDN);
        mpfr_sub(r23402, r23399, r23401, MPFR_RNDN);
        return mpfr_get_d(r23402, MPFR_RNDN);
}

static mpfr_t r23403, r23404, r23405, r23406, r23407;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r23403);
        mpfr_init(r23404);
        mpfr_init(r23405);
        mpfr_init(r23406);
        mpfr_init(r23407);
}

double f_fm(double a, double b) {
        mpfr_set_d(r23403, a, MPFR_RNDN);
        mpfr_set_d(r23404, b, MPFR_RNDN);
        mpfr_add(r23405, r23403, r23404, MPFR_RNDN);
        mpfr_sub(r23406, r23403, r23404, MPFR_RNDN);
        mpfr_mul(r23407, r23405, r23406, MPFR_RNDN);
        return mpfr_get_d(r23407, MPFR_RNDN);
}

static mpfr_t r23408, r23409, r23410, r23411, r23412;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r23408);
        mpfr_init(r23409);
        mpfr_init(r23410);
        mpfr_init(r23411);
        mpfr_init(r23412);
}

double f_dm(double a, double b) {
        mpfr_set_d(r23408, a, MPFR_RNDN);
        mpfr_set_d(r23409, b, MPFR_RNDN);
        mpfr_add(r23410, r23408, r23409, MPFR_RNDN);
        mpfr_sub(r23411, r23408, r23409, MPFR_RNDN);
        mpfr_mul(r23412, r23410, r23411, MPFR_RNDN);
        return mpfr_get_d(r23412, MPFR_RNDN);
}

