#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 r7931 = x_re;
        float r7932 = r7931 * r7931;
        float r7933 = x_im;
        float r7934 = r7933 * r7933;
        float r7935 = r7932 + r7934;
        float r7936 = sqrt(r7935);
        float r7937 = log(r7936);
        float r7938 = y_re;
        float r7939 = r7937 * r7938;
        float r7940 = atan2(r7933, r7931);
        float r7941 = y_im;
        float r7942 = r7940 * r7941;
        float r7943 = r7939 - r7942;
        float r7944 = exp(r7943);
        float r7945 = r7937 * r7941;
        float r7946 = r7940 * r7938;
        float r7947 = r7945 + r7946;
        float r7948 = sin(r7947);
        float r7949 = r7944 * r7948;
        return r7949;
}

double f_id(double x_re, double x_im, double y_re, double y_im) {
        double r7950 = x_re;
        double r7951 = r7950 * r7950;
        double r7952 = x_im;
        double r7953 = r7952 * r7952;
        double r7954 = r7951 + r7953;
        double r7955 = sqrt(r7954);
        double r7956 = log(r7955);
        double r7957 = y_re;
        double r7958 = r7956 * r7957;
        double r7959 = atan2(r7952, r7950);
        double r7960 = y_im;
        double r7961 = r7959 * r7960;
        double r7962 = r7958 - r7961;
        double r7963 = exp(r7962);
        double r7964 = r7956 * r7960;
        double r7965 = r7959 * r7957;
        double r7966 = r7964 + r7965;
        double r7967 = sin(r7966);
        double r7968 = r7963 * r7967;
        return r7968;
}


double f_of(float x_re, float x_im, float y_re, float y_im) {
        float r7969 = x_re;
        float r7970 = -6.15354741578528e-309;
        bool r7971 = r7969 <= r7970;
        float r7972 = r7969 * r7969;
        float r7973 = x_im;
        float r7974 = r7973 * r7973;
        float r7975 = r7972 + r7974;
        float r7976 = sqrt(r7975);
        float r7977 = log(r7976);
        float r7978 = y_re;
        float r7979 = r7977 * r7978;
        float r7980 = atan2(r7973, r7969);
        float r7981 = y_im;
        float r7982 = r7980 * r7981;
        float r7983 = r7979 - r7982;
        float r7984 = exp(r7983);
        float r7985 = r7980 * r7978;
        float r7986 = -1;
        float r7987 = r7986 / r7969;
        float r7988 = log(r7987);
        float r7989 = r7981 * r7988;
        float r7990 = r7985 - r7989;
        float r7991 = sin(r7990);
        float r7992 = r7984 * r7991;
        float r7993 = log(r7969);
        float r7994 = r7993 * r7981;
        float r7995 = r7994 + r7985;
        float r7996 = sin(r7995);
        float r7997 = r7984 * r7996;
        float r7998 = r7971 ? r7992 : r7997;
        return r7998;
}

double f_od(double x_re, double x_im, double y_re, double y_im) {
        double r7999 = x_re;
        double r8000 = -6.15354741578528e-309;
        bool r8001 = r7999 <= r8000;
        double r8002 = r7999 * r7999;
        double r8003 = x_im;
        double r8004 = r8003 * r8003;
        double r8005 = r8002 + r8004;
        double r8006 = sqrt(r8005);
        double r8007 = log(r8006);
        double r8008 = y_re;
        double r8009 = r8007 * r8008;
        double r8010 = atan2(r8003, r7999);
        double r8011 = y_im;
        double r8012 = r8010 * r8011;
        double r8013 = r8009 - r8012;
        double r8014 = exp(r8013);
        double r8015 = r8010 * r8008;
        double r8016 = -1;
        double r8017 = r8016 / r7999;
        double r8018 = log(r8017);
        double r8019 = r8011 * r8018;
        double r8020 = r8015 - r8019;
        double r8021 = sin(r8020);
        double r8022 = r8014 * r8021;
        double r8023 = log(r7999);
        double r8024 = r8023 * r8011;
        double r8025 = r8024 + r8015;
        double r8026 = sin(r8025);
        double r8027 = r8014 * r8026;
        double r8028 = r8001 ? r8022 : r8027;
        return r8028;
}

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 r8029, r8030, r8031, r8032, r8033, r8034, r8035, r8036, r8037, r8038, r8039, r8040, r8041, r8042, r8043, r8044, r8045, r8046, r8047;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8029);
        mpfr_init(r8030);
        mpfr_init(r8031);
        mpfr_init(r8032);
        mpfr_init(r8033);
        mpfr_init(r8034);
        mpfr_init(r8035);
        mpfr_init(r8036);
        mpfr_init(r8037);
        mpfr_init(r8038);
        mpfr_init(r8039);
        mpfr_init(r8040);
        mpfr_init(r8041);
        mpfr_init(r8042);
        mpfr_init(r8043);
        mpfr_init(r8044);
        mpfr_init(r8045);
        mpfr_init(r8046);
        mpfr_init(r8047);
}

double f_im(double x_re, double x_im, double y_re, double y_im) {
        mpfr_set_d(r8029, x_re, MPFR_RNDN);
        mpfr_mul(r8030, r8029, r8029, MPFR_RNDN);
        mpfr_set_d(r8031, x_im, MPFR_RNDN);
        mpfr_mul(r8032, r8031, r8031, MPFR_RNDN);
        mpfr_add(r8033, r8030, r8032, MPFR_RNDN);
        mpfr_sqrt(r8034, r8033, MPFR_RNDN);
        mpfr_log(r8035, r8034, MPFR_RNDN);
        mpfr_set_d(r8036, y_re, MPFR_RNDN);
        mpfr_mul(r8037, r8035, r8036, MPFR_RNDN);
        mpfr_atan2(r8038, r8031, r8029, MPFR_RNDN);
        mpfr_set_d(r8039, y_im, MPFR_RNDN);
        mpfr_mul(r8040, r8038, r8039, MPFR_RNDN);
        mpfr_sub(r8041, r8037, r8040, MPFR_RNDN);
        mpfr_exp(r8042, r8041, MPFR_RNDN);
        mpfr_mul(r8043, r8035, r8039, MPFR_RNDN);
        mpfr_mul(r8044, r8038, r8036, MPFR_RNDN);
        mpfr_add(r8045, r8043, r8044, MPFR_RNDN);
        mpfr_sin(r8046, r8045, MPFR_RNDN);
        mpfr_mul(r8047, r8042, r8046, MPFR_RNDN);
        return mpfr_get_d(r8047, MPFR_RNDN);
}

static mpfr_t r8048, r8049, r8050, r8051, r8052, r8053, r8054, r8055, r8056, r8057, r8058, r8059, r8060, r8061, r8062, r8063, r8064, r8065, r8066, r8067, r8068, r8069, r8070, r8071, r8072, r8073, r8074, r8075, r8076, r8077;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8048);
        mpfr_init_set_str(r8049, "-6.15354741578528e-309", 10, MPFR_RNDN);
        mpfr_init(r8050);
        mpfr_init(r8051);
        mpfr_init(r8052);
        mpfr_init(r8053);
        mpfr_init(r8054);
        mpfr_init(r8055);
        mpfr_init(r8056);
        mpfr_init(r8057);
        mpfr_init(r8058);
        mpfr_init(r8059);
        mpfr_init(r8060);
        mpfr_init(r8061);
        mpfr_init(r8062);
        mpfr_init(r8063);
        mpfr_init(r8064);
        mpfr_init_set_str(r8065, "-1", 10, MPFR_RNDN);
        mpfr_init(r8066);
        mpfr_init(r8067);
        mpfr_init(r8068);
        mpfr_init(r8069);
        mpfr_init(r8070);
        mpfr_init(r8071);
        mpfr_init(r8072);
        mpfr_init(r8073);
        mpfr_init(r8074);
        mpfr_init(r8075);
        mpfr_init(r8076);
        mpfr_init(r8077);
}

double f_fm(double x_re, double x_im, double y_re, double y_im) {
        mpfr_set_d(r8048, x_re, MPFR_RNDN);
        ;
        mpfr_set_si(r8050, mpfr_cmp(r8048, r8049) <= 0, MPFR_RNDN);
        mpfr_mul(r8051, r8048, r8048, MPFR_RNDN);
        mpfr_set_d(r8052, x_im, MPFR_RNDN);
        mpfr_mul(r8053, r8052, r8052, MPFR_RNDN);
        mpfr_add(r8054, r8051, r8053, MPFR_RNDN);
        mpfr_sqrt(r8055, r8054, MPFR_RNDN);
        mpfr_log(r8056, r8055, MPFR_RNDN);
        mpfr_set_d(r8057, y_re, MPFR_RNDN);
        mpfr_mul(r8058, r8056, r8057, MPFR_RNDN);
        mpfr_atan2(r8059, r8052, r8048, MPFR_RNDN);
        mpfr_set_d(r8060, y_im, MPFR_RNDN);
        mpfr_mul(r8061, r8059, r8060, MPFR_RNDN);
        mpfr_sub(r8062, r8058, r8061, MPFR_RNDN);
        mpfr_exp(r8063, r8062, MPFR_RNDN);
        mpfr_mul(r8064, r8059, r8057, MPFR_RNDN);
        ;
        mpfr_div(r8066, r8065, r8048, MPFR_RNDN);
        mpfr_log(r8067, r8066, MPFR_RNDN);
        mpfr_mul(r8068, r8060, r8067, MPFR_RNDN);
        mpfr_sub(r8069, r8064, r8068, MPFR_RNDN);
        mpfr_sin(r8070, r8069, MPFR_RNDN);
        mpfr_mul(r8071, r8063, r8070, MPFR_RNDN);
        mpfr_log(r8072, r8048, MPFR_RNDN);
        mpfr_mul(r8073, r8072, r8060, MPFR_RNDN);
        mpfr_add(r8074, r8073, r8064, MPFR_RNDN);
        mpfr_sin(r8075, r8074, MPFR_RNDN);
        mpfr_mul(r8076, r8063, r8075, MPFR_RNDN);
        if (mpfr_get_si(r8050, MPFR_RNDN)) { mpfr_set(r8077, r8071, MPFR_RNDN); } else { mpfr_set(r8077, r8076, MPFR_RNDN); };
        return mpfr_get_d(r8077, MPFR_RNDN);
}

static mpfr_t r8078, r8079, r8080, r8081, r8082, r8083, r8084, r8085, r8086, r8087, r8088, r8089, r8090, r8091, r8092, r8093, r8094, r8095, r8096, r8097, r8098, r8099, r8100, r8101, r8102, r8103, r8104, r8105, r8106, r8107;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8078);
        mpfr_init_set_str(r8079, "-6.15354741578528e-309", 10, MPFR_RNDN);
        mpfr_init(r8080);
        mpfr_init(r8081);
        mpfr_init(r8082);
        mpfr_init(r8083);
        mpfr_init(r8084);
        mpfr_init(r8085);
        mpfr_init(r8086);
        mpfr_init(r8087);
        mpfr_init(r8088);
        mpfr_init(r8089);
        mpfr_init(r8090);
        mpfr_init(r8091);
        mpfr_init(r8092);
        mpfr_init(r8093);
        mpfr_init(r8094);
        mpfr_init_set_str(r8095, "-1", 10, MPFR_RNDN);
        mpfr_init(r8096);
        mpfr_init(r8097);
        mpfr_init(r8098);
        mpfr_init(r8099);
        mpfr_init(r8100);
        mpfr_init(r8101);
        mpfr_init(r8102);
        mpfr_init(r8103);
        mpfr_init(r8104);
        mpfr_init(r8105);
        mpfr_init(r8106);
        mpfr_init(r8107);
}

double f_dm(double x_re, double x_im, double y_re, double y_im) {
        mpfr_set_d(r8078, x_re, MPFR_RNDN);
        ;
        mpfr_set_si(r8080, mpfr_cmp(r8078, r8079) <= 0, MPFR_RNDN);
        mpfr_mul(r8081, r8078, r8078, MPFR_RNDN);
        mpfr_set_d(r8082, x_im, MPFR_RNDN);
        mpfr_mul(r8083, r8082, r8082, MPFR_RNDN);
        mpfr_add(r8084, r8081, r8083, MPFR_RNDN);
        mpfr_sqrt(r8085, r8084, MPFR_RNDN);
        mpfr_log(r8086, r8085, MPFR_RNDN);
        mpfr_set_d(r8087, y_re, MPFR_RNDN);
        mpfr_mul(r8088, r8086, r8087, MPFR_RNDN);
        mpfr_atan2(r8089, r8082, r8078, MPFR_RNDN);
        mpfr_set_d(r8090, y_im, MPFR_RNDN);
        mpfr_mul(r8091, r8089, r8090, MPFR_RNDN);
        mpfr_sub(r8092, r8088, r8091, MPFR_RNDN);
        mpfr_exp(r8093, r8092, MPFR_RNDN);
        mpfr_mul(r8094, r8089, r8087, MPFR_RNDN);
        ;
        mpfr_div(r8096, r8095, r8078, MPFR_RNDN);
        mpfr_log(r8097, r8096, MPFR_RNDN);
        mpfr_mul(r8098, r8090, r8097, MPFR_RNDN);
        mpfr_sub(r8099, r8094, r8098, MPFR_RNDN);
        mpfr_sin(r8100, r8099, MPFR_RNDN);
        mpfr_mul(r8101, r8093, r8100, MPFR_RNDN);
        mpfr_log(r8102, r8078, MPFR_RNDN);
        mpfr_mul(r8103, r8102, r8090, MPFR_RNDN);
        mpfr_add(r8104, r8103, r8094, MPFR_RNDN);
        mpfr_sin(r8105, r8104, MPFR_RNDN);
        mpfr_mul(r8106, r8093, r8105, MPFR_RNDN);
        if (mpfr_get_si(r8080, MPFR_RNDN)) { mpfr_set(r8107, r8101, MPFR_RNDN); } else { mpfr_set(r8107, r8106, MPFR_RNDN); };
        return mpfr_get_d(r8107, MPFR_RNDN);
}

