#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 r7563 = x_re;
        float r7564 = r7563 * r7563;
        float r7565 = x_im;
        float r7566 = r7565 * r7565;
        float r7567 = r7564 + r7566;
        float r7568 = sqrt(r7567);
        float r7569 = log(r7568);
        float r7570 = y_re;
        float r7571 = r7569 * r7570;
        float r7572 = atan2(r7565, r7563);
        float r7573 = y_im;
        float r7574 = r7572 * r7573;
        float r7575 = r7571 - r7574;
        float r7576 = exp(r7575);
        float r7577 = r7569 * r7573;
        float r7578 = r7572 * r7570;
        float r7579 = r7577 + r7578;
        float r7580 = sin(r7579);
        float r7581 = r7576 * r7580;
        return r7581;
}

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


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

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

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

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2128);
        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);
        mpfr_init(r7647);
        mpfr_init(r7648);
        mpfr_init(r7649);
}

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

static mpfr_t r7650, r7651, r7652, r7653, r7654, r7655, r7656, r7657, r7658, r7659, r7660, r7661, r7662, r7663, r7664;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2128);
        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);
        mpfr_init(r7662);
        mpfr_init(r7663);
        mpfr_init(r7664);
}

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

static mpfr_t r7665, r7666, r7667, r7668, r7669, r7670, r7671, r7672, r7673, r7674, r7675, r7676, r7677, r7678, r7679;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2128);
        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);
        mpfr_init(r7677);
        mpfr_init(r7678);
        mpfr_init(r7679);
}

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

