#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 r58207 = b;
        float r58208 = c;
        float r58209 = r58207 * r58208;
        float r58210 = a;
        float r58211 = d;
        float r58212 = r58210 * r58211;
        float r58213 = r58209 - r58212;
        float r58214 = r58208 * r58208;
        float r58215 = r58211 * r58211;
        float r58216 = r58214 + r58215;
        float r58217 = r58213 / r58216;
        return r58217;
}

double f_id(double a, double b, double c, double d) {
        double r58218 = b;
        double r58219 = c;
        double r58220 = r58218 * r58219;
        double r58221 = a;
        double r58222 = d;
        double r58223 = r58221 * r58222;
        double r58224 = r58220 - r58223;
        double r58225 = r58219 * r58219;
        double r58226 = r58222 * r58222;
        double r58227 = r58225 + r58226;
        double r58228 = r58224 / r58227;
        return r58228;
}


double f_of(float a, float b, float c, float d) {
        float r58229 = b;
        float r58230 = c;
        float r58231 = r58229 * r58230;
        float r58232 = r58230 * r58230;
        float r58233 = d;
        float r58234 = r58233 * r58233;
        float r58235 = r58232 + r58234;
        float r58236 = r58231 / r58235;
        float r58237 = a;
        float r58238 = sqrt(r58235);
        float r58239 = r58237 / r58238;
        float r58240 = r58233 / r58238;
        float r58241 = r58239 * r58240;
        float r58242 = r58236 - r58241;
        return r58242;
}

double f_od(double a, double b, double c, double d) {
        double r58243 = b;
        double r58244 = c;
        double r58245 = r58243 * r58244;
        double r58246 = r58244 * r58244;
        double r58247 = d;
        double r58248 = r58247 * r58247;
        double r58249 = r58246 + r58248;
        double r58250 = r58245 / r58249;
        double r58251 = a;
        double r58252 = sqrt(r58249);
        double r58253 = r58251 / r58252;
        double r58254 = r58247 / r58252;
        double r58255 = r58253 * r58254;
        double r58256 = r58250 - r58255;
        return r58256;
}

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 r58257, r58258, r58259, r58260, r58261, r58262, r58263, r58264, r58265, r58266, r58267;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r58257);
        mpfr_init(r58258);
        mpfr_init(r58259);
        mpfr_init(r58260);
        mpfr_init(r58261);
        mpfr_init(r58262);
        mpfr_init(r58263);
        mpfr_init(r58264);
        mpfr_init(r58265);
        mpfr_init(r58266);
        mpfr_init(r58267);
}

double f_im(double a, double b, double c, double d) {
        mpfr_set_d(r58257, b, MPFR_RNDN);
        mpfr_set_d(r58258, c, MPFR_RNDN);
        mpfr_mul(r58259, r58257, r58258, MPFR_RNDN);
        mpfr_set_d(r58260, a, MPFR_RNDN);
        mpfr_set_d(r58261, d, MPFR_RNDN);
        mpfr_mul(r58262, r58260, r58261, MPFR_RNDN);
        mpfr_sub(r58263, r58259, r58262, MPFR_RNDN);
        mpfr_mul(r58264, r58258, r58258, MPFR_RNDN);
        mpfr_mul(r58265, r58261, r58261, MPFR_RNDN);
        mpfr_add(r58266, r58264, r58265, MPFR_RNDN);
        mpfr_div(r58267, r58263, r58266, MPFR_RNDN);
        return mpfr_get_d(r58267, MPFR_RNDN);
}

static mpfr_t r58268, r58269, r58270, r58271, r58272, r58273, r58274, r58275, r58276, r58277, r58278, r58279, r58280, r58281;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r58268);
        mpfr_init(r58269);
        mpfr_init(r58270);
        mpfr_init(r58271);
        mpfr_init(r58272);
        mpfr_init(r58273);
        mpfr_init(r58274);
        mpfr_init(r58275);
        mpfr_init(r58276);
        mpfr_init(r58277);
        mpfr_init(r58278);
        mpfr_init(r58279);
        mpfr_init(r58280);
        mpfr_init(r58281);
}

double f_fm(double a, double b, double c, double d) {
        mpfr_set_d(r58268, b, MPFR_RNDN);
        mpfr_set_d(r58269, c, MPFR_RNDN);
        mpfr_mul(r58270, r58268, r58269, MPFR_RNDN);
        mpfr_mul(r58271, r58269, r58269, MPFR_RNDN);
        mpfr_set_d(r58272, d, MPFR_RNDN);
        mpfr_mul(r58273, r58272, r58272, MPFR_RNDN);
        mpfr_add(r58274, r58271, r58273, MPFR_RNDN);
        mpfr_div(r58275, r58270, r58274, MPFR_RNDN);
        mpfr_set_d(r58276, a, MPFR_RNDN);
        mpfr_sqrt(r58277, r58274, MPFR_RNDN);
        mpfr_div(r58278, r58276, r58277, MPFR_RNDN);
        mpfr_div(r58279, r58272, r58277, MPFR_RNDN);
        mpfr_mul(r58280, r58278, r58279, MPFR_RNDN);
        mpfr_sub(r58281, r58275, r58280, MPFR_RNDN);
        return mpfr_get_d(r58281, MPFR_RNDN);
}

static mpfr_t r58282, r58283, r58284, r58285, r58286, r58287, r58288, r58289, r58290, r58291, r58292, r58293, r58294, r58295;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r58282);
        mpfr_init(r58283);
        mpfr_init(r58284);
        mpfr_init(r58285);
        mpfr_init(r58286);
        mpfr_init(r58287);
        mpfr_init(r58288);
        mpfr_init(r58289);
        mpfr_init(r58290);
        mpfr_init(r58291);
        mpfr_init(r58292);
        mpfr_init(r58293);
        mpfr_init(r58294);
        mpfr_init(r58295);
}

double f_dm(double a, double b, double c, double d) {
        mpfr_set_d(r58282, b, MPFR_RNDN);
        mpfr_set_d(r58283, c, MPFR_RNDN);
        mpfr_mul(r58284, r58282, r58283, MPFR_RNDN);
        mpfr_mul(r58285, r58283, r58283, MPFR_RNDN);
        mpfr_set_d(r58286, d, MPFR_RNDN);
        mpfr_mul(r58287, r58286, r58286, MPFR_RNDN);
        mpfr_add(r58288, r58285, r58287, MPFR_RNDN);
        mpfr_div(r58289, r58284, r58288, MPFR_RNDN);
        mpfr_set_d(r58290, a, MPFR_RNDN);
        mpfr_sqrt(r58291, r58288, MPFR_RNDN);
        mpfr_div(r58292, r58290, r58291, MPFR_RNDN);
        mpfr_div(r58293, r58286, r58291, MPFR_RNDN);
        mpfr_mul(r58294, r58292, r58293, MPFR_RNDN);
        mpfr_sub(r58295, r58289, r58294, MPFR_RNDN);
        return mpfr_get_d(r58295, MPFR_RNDN);
}

