#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 r58061 = b;
        float r58062 = c;
        float r58063 = r58061 * r58062;
        float r58064 = a;
        float r58065 = d;
        float r58066 = r58064 * r58065;
        float r58067 = r58063 - r58066;
        float r58068 = r58062 * r58062;
        float r58069 = r58065 * r58065;
        float r58070 = r58068 + r58069;
        float r58071 = r58067 / r58070;
        return r58071;
}

double f_id(double a, double b, double c, double d) {
        double r58072 = b;
        double r58073 = c;
        double r58074 = r58072 * r58073;
        double r58075 = a;
        double r58076 = d;
        double r58077 = r58075 * r58076;
        double r58078 = r58074 - r58077;
        double r58079 = r58073 * r58073;
        double r58080 = r58076 * r58076;
        double r58081 = r58079 + r58080;
        double r58082 = r58078 / r58081;
        return r58082;
}


double f_of(float a, float b, float c, float d) {
        float r58083 = b;
        float r58084 = c;
        float r58085 = r58083 * r58084;
        float r58086 = r58084 * r58084;
        float r58087 = d;
        float r58088 = r58087 * r58087;
        float r58089 = r58086 + r58088;
        float r58090 = r58085 / r58089;
        float r58091 = a;
        float r58092 = sqrt(r58089);
        float r58093 = r58091 / r58092;
        float r58094 = r58087 / r58092;
        float r58095 = r58093 * r58094;
        float r58096 = r58090 - r58095;
        return r58096;
}

double f_od(double a, double b, double c, double d) {
        double r58097 = b;
        double r58098 = c;
        double r58099 = r58097 * r58098;
        double r58100 = r58098 * r58098;
        double r58101 = d;
        double r58102 = r58101 * r58101;
        double r58103 = r58100 + r58102;
        double r58104 = r58099 / r58103;
        double r58105 = a;
        double r58106 = sqrt(r58103);
        double r58107 = r58105 / r58106;
        double r58108 = r58101 / r58106;
        double r58109 = r58107 * r58108;
        double r58110 = r58104 - r58109;
        return r58110;
}

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 r58111, r58112, r58113, r58114, r58115, r58116, r58117, r58118, r58119, r58120, r58121;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r58111);
        mpfr_init(r58112);
        mpfr_init(r58113);
        mpfr_init(r58114);
        mpfr_init(r58115);
        mpfr_init(r58116);
        mpfr_init(r58117);
        mpfr_init(r58118);
        mpfr_init(r58119);
        mpfr_init(r58120);
        mpfr_init(r58121);
}

double f_im(double a, double b, double c, double d) {
        mpfr_set_d(r58111, b, MPFR_RNDN);
        mpfr_set_d(r58112, c, MPFR_RNDN);
        mpfr_mul(r58113, r58111, r58112, MPFR_RNDN);
        mpfr_set_d(r58114, a, MPFR_RNDN);
        mpfr_set_d(r58115, d, MPFR_RNDN);
        mpfr_mul(r58116, r58114, r58115, MPFR_RNDN);
        mpfr_sub(r58117, r58113, r58116, MPFR_RNDN);
        mpfr_mul(r58118, r58112, r58112, MPFR_RNDN);
        mpfr_mul(r58119, r58115, r58115, MPFR_RNDN);
        mpfr_add(r58120, r58118, r58119, MPFR_RNDN);
        mpfr_div(r58121, r58117, r58120, MPFR_RNDN);
        return mpfr_get_d(r58121, MPFR_RNDN);
}

static mpfr_t r58122, r58123, r58124, r58125, r58126, r58127, r58128, r58129, r58130, r58131, r58132, r58133, r58134, r58135;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r58122);
        mpfr_init(r58123);
        mpfr_init(r58124);
        mpfr_init(r58125);
        mpfr_init(r58126);
        mpfr_init(r58127);
        mpfr_init(r58128);
        mpfr_init(r58129);
        mpfr_init(r58130);
        mpfr_init(r58131);
        mpfr_init(r58132);
        mpfr_init(r58133);
        mpfr_init(r58134);
        mpfr_init(r58135);
}

double f_fm(double a, double b, double c, double d) {
        mpfr_set_d(r58122, b, MPFR_RNDN);
        mpfr_set_d(r58123, c, MPFR_RNDN);
        mpfr_mul(r58124, r58122, r58123, MPFR_RNDN);
        mpfr_mul(r58125, r58123, r58123, MPFR_RNDN);
        mpfr_set_d(r58126, d, MPFR_RNDN);
        mpfr_mul(r58127, r58126, r58126, MPFR_RNDN);
        mpfr_add(r58128, r58125, r58127, MPFR_RNDN);
        mpfr_div(r58129, r58124, r58128, MPFR_RNDN);
        mpfr_set_d(r58130, a, MPFR_RNDN);
        mpfr_sqrt(r58131, r58128, MPFR_RNDN);
        mpfr_div(r58132, r58130, r58131, MPFR_RNDN);
        mpfr_div(r58133, r58126, r58131, MPFR_RNDN);
        mpfr_mul(r58134, r58132, r58133, MPFR_RNDN);
        mpfr_sub(r58135, r58129, r58134, MPFR_RNDN);
        return mpfr_get_d(r58135, MPFR_RNDN);
}

static mpfr_t r58136, r58137, r58138, r58139, r58140, r58141, r58142, r58143, r58144, r58145, r58146, r58147, r58148, r58149;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r58136);
        mpfr_init(r58137);
        mpfr_init(r58138);
        mpfr_init(r58139);
        mpfr_init(r58140);
        mpfr_init(r58141);
        mpfr_init(r58142);
        mpfr_init(r58143);
        mpfr_init(r58144);
        mpfr_init(r58145);
        mpfr_init(r58146);
        mpfr_init(r58147);
        mpfr_init(r58148);
        mpfr_init(r58149);
}

double f_dm(double a, double b, double c, double d) {
        mpfr_set_d(r58136, b, MPFR_RNDN);
        mpfr_set_d(r58137, c, MPFR_RNDN);
        mpfr_mul(r58138, r58136, r58137, MPFR_RNDN);
        mpfr_mul(r58139, r58137, r58137, MPFR_RNDN);
        mpfr_set_d(r58140, d, MPFR_RNDN);
        mpfr_mul(r58141, r58140, r58140, MPFR_RNDN);
        mpfr_add(r58142, r58139, r58141, MPFR_RNDN);
        mpfr_div(r58143, r58138, r58142, MPFR_RNDN);
        mpfr_set_d(r58144, a, MPFR_RNDN);
        mpfr_sqrt(r58145, r58142, MPFR_RNDN);
        mpfr_div(r58146, r58144, r58145, MPFR_RNDN);
        mpfr_div(r58147, r58140, r58145, MPFR_RNDN);
        mpfr_mul(r58148, r58146, r58147, MPFR_RNDN);
        mpfr_sub(r58149, r58143, r58148, MPFR_RNDN);
        return mpfr_get_d(r58149, MPFR_RNDN);
}

