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

char *name = "powComplex, imaginary part";

double f_if(float x_re, float x_im, float y_re, float y_im) {
        float r7560 = x_re;
        float r7561 = r7560 * r7560;
        float r7562 = x_im;
        float r7563 = r7562 * r7562;
        float r7564 = r7561 + r7563;
        float r7565 = sqrt(r7564);
        float r7566 = log(r7565);
        float r7567 = y_re;
        float r7568 = r7566 * r7567;
        float r7569 = atan2(r7562, r7560);
        float r7570 = y_im;
        float r7571 = r7569 * r7570;
        float r7572 = r7568 - r7571;
        float r7573 = exp(r7572);
        float r7574 = r7566 * r7570;
        float r7575 = r7569 * r7567;
        float r7576 = r7574 + r7575;
        float r7577 = sin(r7576);
        float r7578 = r7573 * r7577;
        return r7578;
}

double f_id(double x_re, double x_im, double y_re, double y_im) {
        double r7579 = x_re;
        double r7580 = r7579 * r7579;
        double r7581 = x_im;
        double r7582 = r7581 * r7581;
        double r7583 = r7580 + r7582;
        double r7584 = sqrt(r7583);
        double r7585 = log(r7584);
        double r7586 = y_re;
        double r7587 = r7585 * r7586;
        double r7588 = atan2(r7581, r7579);
        double r7589 = y_im;
        double r7590 = r7588 * r7589;
        double r7591 = r7587 - r7590;
        double r7592 = exp(r7591);
        double r7593 = r7585 * r7589;
        double r7594 = r7588 * r7586;
        double r7595 = r7593 + r7594;
        double r7596 = sin(r7595);
        double r7597 = r7592 * r7596;
        return r7597;
}


double f_of(float x_re, float x_im, float y_re, float y_im) {
        float r7598 = y_im;
        float r7599 = x_re;
        float r7600 = x_im;
        float r7601 = hypot(r7599, r7600);
        float r7602 = log(r7601);
        float r7603 = atan2(r7600, r7599);
        float r7604 = y_re;
        float r7605 = r7603 * r7604;
        float r7606 = fma(r7598, r7602, r7605);
        float r7607 = sin(r7606);
        float r7608 = r7603 * r7598;
        float r7609 = r7604 * r7602;
        float r7610 = r7608 - r7609;
        float r7611 = exp(r7610);
        float r7612 = r7607 / r7611;
        return r7612;
}

double f_od(double x_re, double x_im, double y_re, double y_im) {
        double r7613 = y_im;
        double r7614 = x_re;
        double r7615 = x_im;
        double r7616 = hypot(r7614, r7615);
        double r7617 = log(r7616);
        double r7618 = atan2(r7615, r7614);
        double r7619 = y_re;
        double r7620 = r7618 * r7619;
        double r7621 = fma(r7613, r7617, r7620);
        double r7622 = sin(r7621);
        double r7623 = r7618 * r7613;
        double r7624 = r7619 * r7617;
        double r7625 = r7623 - r7624;
        double r7626 = exp(r7625);
        double r7627 = r7622 / r7626;
        return r7627;
}

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 r7628, r7629, r7630, r7631, r7632, r7633, r7634, r7635, r7636, r7637, r7638, r7639, r7640, r7641, r7642, r7643, r7644, r7645, r7646;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2128);
        mpfr_init(r7628);
        mpfr_init(r7629);
        mpfr_init(r7630);
        mpfr_init(r7631);
        mpfr_init(r7632);
        mpfr_init(r7633);
        mpfr_init(r7634);
        mpfr_init(r7635);
        mpfr_init(r7636);
        mpfr_init(r7637);
        mpfr_init(r7638);
        mpfr_init(r7639);
        mpfr_init(r7640);
        mpfr_init(r7641);
        mpfr_init(r7642);
        mpfr_init(r7643);
        mpfr_init(r7644);
        mpfr_init(r7645);
        mpfr_init(r7646);
}

double f_im(double x_re, double x_im, double y_re, double y_im) {
        mpfr_set_d(r7628, x_re, MPFR_RNDN);
        mpfr_mul(r7629, r7628, r7628, MPFR_RNDN);
        mpfr_set_d(r7630, x_im, MPFR_RNDN);
        mpfr_mul(r7631, r7630, r7630, MPFR_RNDN);
        mpfr_add(r7632, r7629, r7631, MPFR_RNDN);
        mpfr_sqrt(r7633, r7632, MPFR_RNDN);
        mpfr_log(r7634, r7633, MPFR_RNDN);
        mpfr_set_d(r7635, y_re, MPFR_RNDN);
        mpfr_mul(r7636, r7634, r7635, MPFR_RNDN);
        mpfr_atan2(r7637, r7630, r7628, MPFR_RNDN);
        mpfr_set_d(r7638, y_im, MPFR_RNDN);
        mpfr_mul(r7639, r7637, r7638, MPFR_RNDN);
        mpfr_sub(r7640, r7636, r7639, MPFR_RNDN);
        mpfr_exp(r7641, r7640, MPFR_RNDN);
        mpfr_mul(r7642, r7634, r7638, MPFR_RNDN);
        mpfr_mul(r7643, r7637, r7635, MPFR_RNDN);
        mpfr_add(r7644, r7642, r7643, MPFR_RNDN);
        mpfr_sin(r7645, r7644, MPFR_RNDN);
        mpfr_mul(r7646, r7641, r7645, MPFR_RNDN);
        return mpfr_get_d(r7646, MPFR_RNDN);
}

static mpfr_t r7647, r7648, r7649, r7650, r7651, r7652, r7653, r7654, r7655, r7656, r7657, r7658, r7659, r7660, r7661;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2128);
        mpfr_init(r7647);
        mpfr_init(r7648);
        mpfr_init(r7649);
        mpfr_init(r7650);
        mpfr_init(r7651);
        mpfr_init(r7652);
        mpfr_init(r7653);
        mpfr_init(r7654);
        mpfr_init(r7655);
        mpfr_init(r7656);
        mpfr_init(r7657);
        mpfr_init(r7658);
        mpfr_init(r7659);
        mpfr_init(r7660);
        mpfr_init(r7661);
}

double f_fm(double x_re, double x_im, double y_re, double y_im) {
        mpfr_set_d(r7647, y_im, MPFR_RNDN);
        mpfr_set_d(r7648, x_re, MPFR_RNDN);
        mpfr_set_d(r7649, x_im, MPFR_RNDN);
        mpfr_hypot(r7650, r7648, r7649, MPFR_RNDN);
        mpfr_log(r7651, r7650, MPFR_RNDN);
        mpfr_atan2(r7652, r7649, r7648, MPFR_RNDN);
        mpfr_set_d(r7653, y_re, MPFR_RNDN);
        mpfr_mul(r7654, r7652, r7653, MPFR_RNDN);
        mpfr_fma(r7655, r7647, r7651, r7654, MPFR_RNDN);
        mpfr_sin(r7656, r7655, MPFR_RNDN);
        mpfr_mul(r7657, r7652, r7647, MPFR_RNDN);
        mpfr_mul(r7658, r7653, r7651, MPFR_RNDN);
        mpfr_sub(r7659, r7657, r7658, MPFR_RNDN);
        mpfr_exp(r7660, r7659, MPFR_RNDN);
        mpfr_div(r7661, r7656, r7660, MPFR_RNDN);
        return mpfr_get_d(r7661, MPFR_RNDN);
}

static mpfr_t r7662, r7663, r7664, r7665, r7666, r7667, r7668, r7669, r7670, r7671, r7672, r7673, r7674, r7675, r7676;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2128);
        mpfr_init(r7662);
        mpfr_init(r7663);
        mpfr_init(r7664);
        mpfr_init(r7665);
        mpfr_init(r7666);
        mpfr_init(r7667);
        mpfr_init(r7668);
        mpfr_init(r7669);
        mpfr_init(r7670);
        mpfr_init(r7671);
        mpfr_init(r7672);
        mpfr_init(r7673);
        mpfr_init(r7674);
        mpfr_init(r7675);
        mpfr_init(r7676);
}

double f_dm(double x_re, double x_im, double y_re, double y_im) {
        mpfr_set_d(r7662, y_im, MPFR_RNDN);
        mpfr_set_d(r7663, x_re, MPFR_RNDN);
        mpfr_set_d(r7664, x_im, MPFR_RNDN);
        mpfr_hypot(r7665, r7663, r7664, MPFR_RNDN);
        mpfr_log(r7666, r7665, MPFR_RNDN);
        mpfr_atan2(r7667, r7664, r7663, MPFR_RNDN);
        mpfr_set_d(r7668, y_re, MPFR_RNDN);
        mpfr_mul(r7669, r7667, r7668, MPFR_RNDN);
        mpfr_fma(r7670, r7662, r7666, r7669, MPFR_RNDN);
        mpfr_sin(r7671, r7670, MPFR_RNDN);
        mpfr_mul(r7672, r7667, r7662, MPFR_RNDN);
        mpfr_mul(r7673, r7668, r7666, MPFR_RNDN);
        mpfr_sub(r7674, r7672, r7673, MPFR_RNDN);
        mpfr_exp(r7675, r7674, MPFR_RNDN);
        mpfr_div(r7676, r7671, r7675, MPFR_RNDN);
        return mpfr_get_d(r7676, MPFR_RNDN);
}

