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

char *name = "math.log/2 on complex, real part";

double f_if(float re, float im, float base) {
        float r8158 = re;
        float r8159 = r8158 * r8158;
        float r8160 = im;
        float r8161 = r8160 * r8160;
        float r8162 = r8159 + r8161;
        float r8163 = sqrt(r8162);
        float r8164 = log(r8163);
        float r8165 = base;
        float r8166 = log(r8165);
        float r8167 = r8164 * r8166;
        float r8168 = atan2(r8160, r8158);
        float r8169 = 0.0f;
        float r8170 = r8168 * r8169;
        float r8171 = r8167 + r8170;
        float r8172 = r8166 * r8166;
        float r8173 = r8169 * r8169;
        float r8174 = r8172 + r8173;
        float r8175 = r8171 / r8174;
        return r8175;
}

double f_id(double re, double im, double base) {
        double r8176 = re;
        double r8177 = r8176 * r8176;
        double r8178 = im;
        double r8179 = r8178 * r8178;
        double r8180 = r8177 + r8179;
        double r8181 = sqrt(r8180);
        double r8182 = log(r8181);
        double r8183 = base;
        double r8184 = log(r8183);
        double r8185 = r8182 * r8184;
        double r8186 = atan2(r8178, r8176);
        double r8187 = 0.0;
        double r8188 = r8186 * r8187;
        double r8189 = r8185 + r8188;
        double r8190 = r8184 * r8184;
        double r8191 = r8187 * r8187;
        double r8192 = r8190 + r8191;
        double r8193 = r8189 / r8192;
        return r8193;
}


double f_of(float re, float im, float base) {
        float r8194 = re;
        float r8195 = im;
        float r8196 = hypot(r8194, r8195);
        float r8197 = log(r8196);
        float r8198 = 1.0f;
        float r8199 = base;
        float r8200 = log(r8199);
        float r8201 = r8198 / r8200;
        float r8202 = r8197 * r8201;
        return r8202;
}

double f_od(double re, double im, double base) {
        double r8203 = re;
        double r8204 = im;
        double r8205 = hypot(r8203, r8204);
        double r8206 = log(r8205);
        double r8207 = 1.0;
        double r8208 = base;
        double r8209 = log(r8208);
        double r8210 = r8207 / r8209;
        double r8211 = r8206 * r8210;
        return r8211;
}

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 r8212, r8213, r8214, r8215, r8216, r8217, r8218, r8219, r8220, r8221, r8222, r8223, r8224, r8225, r8226, r8227, r8228, r8229;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r8212);
        mpfr_init(r8213);
        mpfr_init(r8214);
        mpfr_init(r8215);
        mpfr_init(r8216);
        mpfr_init(r8217);
        mpfr_init(r8218);
        mpfr_init(r8219);
        mpfr_init(r8220);
        mpfr_init(r8221);
        mpfr_init(r8222);
        mpfr_init_set_str(r8223, "0", 10, MPFR_RNDN);
        mpfr_init(r8224);
        mpfr_init(r8225);
        mpfr_init(r8226);
        mpfr_init(r8227);
        mpfr_init(r8228);
        mpfr_init(r8229);
}

double f_im(double re, double im, double base) {
        mpfr_set_d(r8212, re, MPFR_RNDN);
        mpfr_mul(r8213, r8212, r8212, MPFR_RNDN);
        mpfr_set_d(r8214, im, MPFR_RNDN);
        mpfr_mul(r8215, r8214, r8214, MPFR_RNDN);
        mpfr_add(r8216, r8213, r8215, MPFR_RNDN);
        mpfr_sqrt(r8217, r8216, MPFR_RNDN);
        mpfr_log(r8218, r8217, MPFR_RNDN);
        mpfr_set_d(r8219, base, MPFR_RNDN);
        mpfr_log(r8220, r8219, MPFR_RNDN);
        mpfr_mul(r8221, r8218, r8220, MPFR_RNDN);
        mpfr_atan2(r8222, r8214, r8212, MPFR_RNDN);
        ;
        mpfr_mul(r8224, r8222, r8223, MPFR_RNDN);
        mpfr_add(r8225, r8221, r8224, MPFR_RNDN);
        mpfr_mul(r8226, r8220, r8220, MPFR_RNDN);
        mpfr_mul(r8227, r8223, r8223, MPFR_RNDN);
        mpfr_add(r8228, r8226, r8227, MPFR_RNDN);
        mpfr_div(r8229, r8225, r8228, MPFR_RNDN);
        return mpfr_get_d(r8229, MPFR_RNDN);
}

static mpfr_t r8230, r8231, r8232, r8233, r8234, r8235, r8236, r8237, r8238;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8230);
        mpfr_init(r8231);
        mpfr_init(r8232);
        mpfr_init(r8233);
        mpfr_init_set_str(r8234, "1", 10, MPFR_RNDN);
        mpfr_init(r8235);
        mpfr_init(r8236);
        mpfr_init(r8237);
        mpfr_init(r8238);
}

double f_fm(double re, double im, double base) {
        mpfr_set_d(r8230, re, MPFR_RNDN);
        mpfr_set_d(r8231, im, MPFR_RNDN);
        mpfr_hypot(r8232, r8230, r8231, MPFR_RNDN);
        mpfr_log(r8233, r8232, MPFR_RNDN);
        ;
        mpfr_set_d(r8235, base, MPFR_RNDN);
        mpfr_log(r8236, r8235, MPFR_RNDN);
        mpfr_div(r8237, r8234, r8236, MPFR_RNDN);
        mpfr_mul(r8238, r8233, r8237, MPFR_RNDN);
        return mpfr_get_d(r8238, MPFR_RNDN);
}

static mpfr_t r8239, r8240, r8241, r8242, r8243, r8244, r8245, r8246, r8247;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8239);
        mpfr_init(r8240);
        mpfr_init(r8241);
        mpfr_init(r8242);
        mpfr_init_set_str(r8243, "1", 10, MPFR_RNDN);
        mpfr_init(r8244);
        mpfr_init(r8245);
        mpfr_init(r8246);
        mpfr_init(r8247);
}

double f_dm(double re, double im, double base) {
        mpfr_set_d(r8239, re, MPFR_RNDN);
        mpfr_set_d(r8240, im, MPFR_RNDN);
        mpfr_hypot(r8241, r8239, r8240, MPFR_RNDN);
        mpfr_log(r8242, r8241, MPFR_RNDN);
        ;
        mpfr_set_d(r8244, base, MPFR_RNDN);
        mpfr_log(r8245, r8244, MPFR_RNDN);
        mpfr_div(r8246, r8243, r8245, MPFR_RNDN);
        mpfr_mul(r8247, r8242, r8246, MPFR_RNDN);
        return mpfr_get_d(r8247, MPFR_RNDN);
}

