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

char *name = "Complex division, imag part";

double f_if(float a, float b, float c, float d) {
        float r58337 = b;
        float r58338 = c;
        float r58339 = r58337 * r58338;
        float r58340 = a;
        float r58341 = d;
        float r58342 = r58340 * r58341;
        float r58343 = r58339 - r58342;
        float r58344 = r58338 * r58338;
        float r58345 = r58341 * r58341;
        float r58346 = r58344 + r58345;
        float r58347 = r58343 / r58346;
        return r58347;
}

double f_id(double a, double b, double c, double d) {
        double r58348 = b;
        double r58349 = c;
        double r58350 = r58348 * r58349;
        double r58351 = a;
        double r58352 = d;
        double r58353 = r58351 * r58352;
        double r58354 = r58350 - r58353;
        double r58355 = r58349 * r58349;
        double r58356 = r58352 * r58352;
        double r58357 = r58355 + r58356;
        double r58358 = r58354 / r58357;
        return r58358;
}


double f_of(float a, float b, float c, float d) {
        float r58359 = b;
        float r58360 = c;
        float r58361 = r58359 * r58360;
        float r58362 = r58360 * r58360;
        float r58363 = d;
        float r58364 = r58363 * r58363;
        float r58365 = r58362 + r58364;
        float r58366 = r58361 / r58365;
        float r58367 = a;
        float r58368 = sqrt(r58365);
        float r58369 = r58367 / r58368;
        float r58370 = r58363 / r58368;
        float r58371 = r58369 * r58370;
        float r58372 = r58366 - r58371;
        return r58372;
}

double f_od(double a, double b, double c, double d) {
        double r58373 = b;
        double r58374 = c;
        double r58375 = r58373 * r58374;
        double r58376 = r58374 * r58374;
        double r58377 = d;
        double r58378 = r58377 * r58377;
        double r58379 = r58376 + r58378;
        double r58380 = r58375 / r58379;
        double r58381 = a;
        double r58382 = sqrt(r58379);
        double r58383 = r58381 / r58382;
        double r58384 = r58377 / r58382;
        double r58385 = r58383 * r58384;
        double r58386 = r58380 - r58385;
        return r58386;
}

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 r58387, r58388, r58389, r58390, r58391, r58392, r58393, r58394, r58395, r58396, r58397;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r58387);
        mpfr_init(r58388);
        mpfr_init(r58389);
        mpfr_init(r58390);
        mpfr_init(r58391);
        mpfr_init(r58392);
        mpfr_init(r58393);
        mpfr_init(r58394);
        mpfr_init(r58395);
        mpfr_init(r58396);
        mpfr_init(r58397);
}

double f_im(double a, double b, double c, double d) {
        mpfr_set_d(r58387, b, MPFR_RNDN);
        mpfr_set_d(r58388, c, MPFR_RNDN);
        mpfr_mul(r58389, r58387, r58388, MPFR_RNDN);
        mpfr_set_d(r58390, a, MPFR_RNDN);
        mpfr_set_d(r58391, d, MPFR_RNDN);
        mpfr_mul(r58392, r58390, r58391, MPFR_RNDN);
        mpfr_sub(r58393, r58389, r58392, MPFR_RNDN);
        mpfr_mul(r58394, r58388, r58388, MPFR_RNDN);
        mpfr_mul(r58395, r58391, r58391, MPFR_RNDN);
        mpfr_add(r58396, r58394, r58395, MPFR_RNDN);
        mpfr_div(r58397, r58393, r58396, MPFR_RNDN);
        return mpfr_get_d(r58397, MPFR_RNDN);
}

static mpfr_t r58398, r58399, r58400, r58401, r58402, r58403, r58404, r58405, r58406, r58407, r58408, r58409, r58410, r58411;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r58398);
        mpfr_init(r58399);
        mpfr_init(r58400);
        mpfr_init(r58401);
        mpfr_init(r58402);
        mpfr_init(r58403);
        mpfr_init(r58404);
        mpfr_init(r58405);
        mpfr_init(r58406);
        mpfr_init(r58407);
        mpfr_init(r58408);
        mpfr_init(r58409);
        mpfr_init(r58410);
        mpfr_init(r58411);
}

double f_fm(double a, double b, double c, double d) {
        mpfr_set_d(r58398, b, MPFR_RNDN);
        mpfr_set_d(r58399, c, MPFR_RNDN);
        mpfr_mul(r58400, r58398, r58399, MPFR_RNDN);
        mpfr_mul(r58401, r58399, r58399, MPFR_RNDN);
        mpfr_set_d(r58402, d, MPFR_RNDN);
        mpfr_mul(r58403, r58402, r58402, MPFR_RNDN);
        mpfr_add(r58404, r58401, r58403, MPFR_RNDN);
        mpfr_div(r58405, r58400, r58404, MPFR_RNDN);
        mpfr_set_d(r58406, a, MPFR_RNDN);
        mpfr_sqrt(r58407, r58404, MPFR_RNDN);
        mpfr_div(r58408, r58406, r58407, MPFR_RNDN);
        mpfr_div(r58409, r58402, r58407, MPFR_RNDN);
        mpfr_mul(r58410, r58408, r58409, MPFR_RNDN);
        mpfr_sub(r58411, r58405, r58410, MPFR_RNDN);
        return mpfr_get_d(r58411, MPFR_RNDN);
}

static mpfr_t r58412, r58413, r58414, r58415, r58416, r58417, r58418, r58419, r58420, r58421, r58422, r58423, r58424, r58425;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r58412);
        mpfr_init(r58413);
        mpfr_init(r58414);
        mpfr_init(r58415);
        mpfr_init(r58416);
        mpfr_init(r58417);
        mpfr_init(r58418);
        mpfr_init(r58419);
        mpfr_init(r58420);
        mpfr_init(r58421);
        mpfr_init(r58422);
        mpfr_init(r58423);
        mpfr_init(r58424);
        mpfr_init(r58425);
}

double f_dm(double a, double b, double c, double d) {
        mpfr_set_d(r58412, b, MPFR_RNDN);
        mpfr_set_d(r58413, c, MPFR_RNDN);
        mpfr_mul(r58414, r58412, r58413, MPFR_RNDN);
        mpfr_mul(r58415, r58413, r58413, MPFR_RNDN);
        mpfr_set_d(r58416, d, MPFR_RNDN);
        mpfr_mul(r58417, r58416, r58416, MPFR_RNDN);
        mpfr_add(r58418, r58415, r58417, MPFR_RNDN);
        mpfr_div(r58419, r58414, r58418, MPFR_RNDN);
        mpfr_set_d(r58420, a, MPFR_RNDN);
        mpfr_sqrt(r58421, r58418, MPFR_RNDN);
        mpfr_div(r58422, r58420, r58421, MPFR_RNDN);
        mpfr_div(r58423, r58416, r58421, MPFR_RNDN);
        mpfr_mul(r58424, r58422, r58423, MPFR_RNDN);
        mpfr_sub(r58425, r58419, r58424, MPFR_RNDN);
        return mpfr_get_d(r58425, MPFR_RNDN);
}

