#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 r58105 = b;
        float r58106 = c;
        float r58107 = r58105 * r58106;
        float r58108 = a;
        float r58109 = d;
        float r58110 = r58108 * r58109;
        float r58111 = r58107 - r58110;
        float r58112 = r58106 * r58106;
        float r58113 = r58109 * r58109;
        float r58114 = r58112 + r58113;
        float r58115 = r58111 / r58114;
        return r58115;
}

double f_id(double a, double b, double c, double d) {
        double r58116 = b;
        double r58117 = c;
        double r58118 = r58116 * r58117;
        double r58119 = a;
        double r58120 = d;
        double r58121 = r58119 * r58120;
        double r58122 = r58118 - r58121;
        double r58123 = r58117 * r58117;
        double r58124 = r58120 * r58120;
        double r58125 = r58123 + r58124;
        double r58126 = r58122 / r58125;
        return r58126;
}


double f_of(float a, float b, float c, float d) {
        float r58127 = b;
        float r58128 = c;
        float r58129 = r58127 * r58128;
        float r58130 = r58128 * r58128;
        float r58131 = d;
        float r58132 = r58131 * r58131;
        float r58133 = r58130 + r58132;
        float r58134 = r58129 / r58133;
        float r58135 = a;
        float r58136 = sqrt(r58133);
        float r58137 = r58135 / r58136;
        float r58138 = r58131 / r58136;
        float r58139 = r58137 * r58138;
        float r58140 = r58134 - r58139;
        return r58140;
}

double f_od(double a, double b, double c, double d) {
        double r58141 = b;
        double r58142 = c;
        double r58143 = r58141 * r58142;
        double r58144 = r58142 * r58142;
        double r58145 = d;
        double r58146 = r58145 * r58145;
        double r58147 = r58144 + r58146;
        double r58148 = r58143 / r58147;
        double r58149 = a;
        double r58150 = sqrt(r58147);
        double r58151 = r58149 / r58150;
        double r58152 = r58145 / r58150;
        double r58153 = r58151 * r58152;
        double r58154 = r58148 - r58153;
        return r58154;
}

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 r58155, r58156, r58157, r58158, r58159, r58160, r58161, r58162, r58163, r58164, r58165;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r58155);
        mpfr_init(r58156);
        mpfr_init(r58157);
        mpfr_init(r58158);
        mpfr_init(r58159);
        mpfr_init(r58160);
        mpfr_init(r58161);
        mpfr_init(r58162);
        mpfr_init(r58163);
        mpfr_init(r58164);
        mpfr_init(r58165);
}

double f_im(double a, double b, double c, double d) {
        mpfr_set_d(r58155, b, MPFR_RNDN);
        mpfr_set_d(r58156, c, MPFR_RNDN);
        mpfr_mul(r58157, r58155, r58156, MPFR_RNDN);
        mpfr_set_d(r58158, a, MPFR_RNDN);
        mpfr_set_d(r58159, d, MPFR_RNDN);
        mpfr_mul(r58160, r58158, r58159, MPFR_RNDN);
        mpfr_sub(r58161, r58157, r58160, MPFR_RNDN);
        mpfr_mul(r58162, r58156, r58156, MPFR_RNDN);
        mpfr_mul(r58163, r58159, r58159, MPFR_RNDN);
        mpfr_add(r58164, r58162, r58163, MPFR_RNDN);
        mpfr_div(r58165, r58161, r58164, MPFR_RNDN);
        return mpfr_get_d(r58165, MPFR_RNDN);
}

static mpfr_t r58166, r58167, r58168, r58169, r58170, r58171, r58172, r58173, r58174, r58175, r58176, r58177, r58178, r58179;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r58166);
        mpfr_init(r58167);
        mpfr_init(r58168);
        mpfr_init(r58169);
        mpfr_init(r58170);
        mpfr_init(r58171);
        mpfr_init(r58172);
        mpfr_init(r58173);
        mpfr_init(r58174);
        mpfr_init(r58175);
        mpfr_init(r58176);
        mpfr_init(r58177);
        mpfr_init(r58178);
        mpfr_init(r58179);
}

double f_fm(double a, double b, double c, double d) {
        mpfr_set_d(r58166, b, MPFR_RNDN);
        mpfr_set_d(r58167, c, MPFR_RNDN);
        mpfr_mul(r58168, r58166, r58167, MPFR_RNDN);
        mpfr_mul(r58169, r58167, r58167, MPFR_RNDN);
        mpfr_set_d(r58170, d, MPFR_RNDN);
        mpfr_mul(r58171, r58170, r58170, MPFR_RNDN);
        mpfr_add(r58172, r58169, r58171, MPFR_RNDN);
        mpfr_div(r58173, r58168, r58172, MPFR_RNDN);
        mpfr_set_d(r58174, a, MPFR_RNDN);
        mpfr_sqrt(r58175, r58172, MPFR_RNDN);
        mpfr_div(r58176, r58174, r58175, MPFR_RNDN);
        mpfr_div(r58177, r58170, r58175, MPFR_RNDN);
        mpfr_mul(r58178, r58176, r58177, MPFR_RNDN);
        mpfr_sub(r58179, r58173, r58178, MPFR_RNDN);
        return mpfr_get_d(r58179, MPFR_RNDN);
}

static mpfr_t r58180, r58181, r58182, r58183, r58184, r58185, r58186, r58187, r58188, r58189, r58190, r58191, r58192, r58193;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r58180);
        mpfr_init(r58181);
        mpfr_init(r58182);
        mpfr_init(r58183);
        mpfr_init(r58184);
        mpfr_init(r58185);
        mpfr_init(r58186);
        mpfr_init(r58187);
        mpfr_init(r58188);
        mpfr_init(r58189);
        mpfr_init(r58190);
        mpfr_init(r58191);
        mpfr_init(r58192);
        mpfr_init(r58193);
}

double f_dm(double a, double b, double c, double d) {
        mpfr_set_d(r58180, b, MPFR_RNDN);
        mpfr_set_d(r58181, c, MPFR_RNDN);
        mpfr_mul(r58182, r58180, r58181, MPFR_RNDN);
        mpfr_mul(r58183, r58181, r58181, MPFR_RNDN);
        mpfr_set_d(r58184, d, MPFR_RNDN);
        mpfr_mul(r58185, r58184, r58184, MPFR_RNDN);
        mpfr_add(r58186, r58183, r58185, MPFR_RNDN);
        mpfr_div(r58187, r58182, r58186, MPFR_RNDN);
        mpfr_set_d(r58188, a, MPFR_RNDN);
        mpfr_sqrt(r58189, r58186, MPFR_RNDN);
        mpfr_div(r58190, r58188, r58189, MPFR_RNDN);
        mpfr_div(r58191, r58184, r58189, MPFR_RNDN);
        mpfr_mul(r58192, r58190, r58191, MPFR_RNDN);
        mpfr_sub(r58193, r58187, r58192, MPFR_RNDN);
        return mpfr_get_d(r58193, MPFR_RNDN);
}

