#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 r8161 = re;
        float r8162 = r8161 * r8161;
        float r8163 = im;
        float r8164 = r8163 * r8163;
        float r8165 = r8162 + r8164;
        float r8166 = sqrt(r8165);
        float r8167 = log(r8166);
        float r8168 = base;
        float r8169 = log(r8168);
        float r8170 = r8167 * r8169;
        float r8171 = atan2(r8163, r8161);
        float r8172 = 0.0f;
        float r8173 = r8171 * r8172;
        float r8174 = r8170 + r8173;
        float r8175 = r8169 * r8169;
        float r8176 = r8172 * r8172;
        float r8177 = r8175 + r8176;
        float r8178 = r8174 / r8177;
        return r8178;
}

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


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

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

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

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        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(r8223);
        mpfr_init(r8224);
        mpfr_init(r8225);
        mpfr_init_set_str(r8226, "0", 10, MPFR_RNDN);
        mpfr_init(r8227);
        mpfr_init(r8228);
        mpfr_init(r8229);
        mpfr_init(r8230);
        mpfr_init(r8231);
        mpfr_init(r8232);
}

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

static mpfr_t r8233, r8234, r8235, r8236, r8237, r8238, r8239, r8240, r8241;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8233);
        mpfr_init(r8234);
        mpfr_init(r8235);
        mpfr_init(r8236);
        mpfr_init_set_str(r8237, "1", 10, MPFR_RNDN);
        mpfr_init(r8238);
        mpfr_init(r8239);
        mpfr_init(r8240);
        mpfr_init(r8241);
}

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

static mpfr_t r8242, r8243, r8244, r8245, r8246, r8247, r8248, r8249, r8250;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8242);
        mpfr_init(r8243);
        mpfr_init(r8244);
        mpfr_init(r8245);
        mpfr_init_set_str(r8246, "1", 10, MPFR_RNDN);
        mpfr_init(r8247);
        mpfr_init(r8248);
        mpfr_init(r8249);
        mpfr_init(r8250);
}

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

