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

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

double f_if(float re, float im, float base) {
        float r8248 = im;
        float r8249 = re;
        float r8250 = atan2(r8248, r8249);
        float r8251 = base;
        float r8252 = log(r8251);
        float r8253 = r8250 * r8252;
        float r8254 = r8249 * r8249;
        float r8255 = r8248 * r8248;
        float r8256 = r8254 + r8255;
        float r8257 = sqrt(r8256);
        float r8258 = log(r8257);
        float r8259 = 0.0f;
        float r8260 = r8258 * r8259;
        float r8261 = r8253 - r8260;
        float r8262 = r8252 * r8252;
        float r8263 = r8259 * r8259;
        float r8264 = r8262 + r8263;
        float r8265 = r8261 / r8264;
        return r8265;
}

double f_id(double re, double im, double base) {
        double r8266 = im;
        double r8267 = re;
        double r8268 = atan2(r8266, r8267);
        double r8269 = base;
        double r8270 = log(r8269);
        double r8271 = r8268 * r8270;
        double r8272 = r8267 * r8267;
        double r8273 = r8266 * r8266;
        double r8274 = r8272 + r8273;
        double r8275 = sqrt(r8274);
        double r8276 = log(r8275);
        double r8277 = 0.0;
        double r8278 = r8276 * r8277;
        double r8279 = r8271 - r8278;
        double r8280 = r8270 * r8270;
        double r8281 = r8277 * r8277;
        double r8282 = r8280 + r8281;
        double r8283 = r8279 / r8282;
        return r8283;
}


double f_of(float re, float im, float base) {
        float r8284 = 1.0f;
        float r8285 = base;
        float r8286 = log(r8285);
        float r8287 = im;
        float r8288 = re;
        float r8289 = atan2(r8287, r8288);
        float r8290 = r8286 / r8289;
        float r8291 = r8284 / r8290;
        return r8291;
}

double f_od(double re, double im, double base) {
        double r8292 = 1.0;
        double r8293 = base;
        double r8294 = log(r8293);
        double r8295 = im;
        double r8296 = re;
        double r8297 = atan2(r8295, r8296);
        double r8298 = r8294 / r8297;
        double r8299 = r8292 / r8298;
        return r8299;
}

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 r8300, r8301, r8302, r8303, r8304, r8305, r8306, r8307, r8308, r8309, r8310, r8311, r8312, r8313, r8314, r8315, r8316, r8317;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r8300);
        mpfr_init(r8301);
        mpfr_init(r8302);
        mpfr_init(r8303);
        mpfr_init(r8304);
        mpfr_init(r8305);
        mpfr_init(r8306);
        mpfr_init(r8307);
        mpfr_init(r8308);
        mpfr_init(r8309);
        mpfr_init(r8310);
        mpfr_init_set_str(r8311, "0", 10, MPFR_RNDN);
        mpfr_init(r8312);
        mpfr_init(r8313);
        mpfr_init(r8314);
        mpfr_init(r8315);
        mpfr_init(r8316);
        mpfr_init(r8317);
}

double f_im(double re, double im, double base) {
        mpfr_set_d(r8300, im, MPFR_RNDN);
        mpfr_set_d(r8301, re, MPFR_RNDN);
        mpfr_atan2(r8302, r8300, r8301, MPFR_RNDN);
        mpfr_set_d(r8303, base, MPFR_RNDN);
        mpfr_log(r8304, r8303, MPFR_RNDN);
        mpfr_mul(r8305, r8302, r8304, MPFR_RNDN);
        mpfr_mul(r8306, r8301, r8301, MPFR_RNDN);
        mpfr_mul(r8307, r8300, r8300, MPFR_RNDN);
        mpfr_add(r8308, r8306, r8307, MPFR_RNDN);
        mpfr_sqrt(r8309, r8308, MPFR_RNDN);
        mpfr_log(r8310, r8309, MPFR_RNDN);
        ;
        mpfr_mul(r8312, r8310, r8311, MPFR_RNDN);
        mpfr_sub(r8313, r8305, r8312, MPFR_RNDN);
        mpfr_mul(r8314, r8304, r8304, MPFR_RNDN);
        mpfr_mul(r8315, r8311, r8311, MPFR_RNDN);
        mpfr_add(r8316, r8314, r8315, MPFR_RNDN);
        mpfr_div(r8317, r8313, r8316, MPFR_RNDN);
        return mpfr_get_d(r8317, MPFR_RNDN);
}

static mpfr_t r8318, r8319, r8320, r8321, r8322, r8323, r8324, r8325;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init_set_str(r8318, "1", 10, MPFR_RNDN);
        mpfr_init(r8319);
        mpfr_init(r8320);
        mpfr_init(r8321);
        mpfr_init(r8322);
        mpfr_init(r8323);
        mpfr_init(r8324);
        mpfr_init(r8325);
}

double f_fm(double re, double im, double base) {
        ;
        mpfr_set_d(r8319, base, MPFR_RNDN);
        mpfr_log(r8320, r8319, MPFR_RNDN);
        mpfr_set_d(r8321, im, MPFR_RNDN);
        mpfr_set_d(r8322, re, MPFR_RNDN);
        mpfr_atan2(r8323, r8321, r8322, MPFR_RNDN);
        mpfr_div(r8324, r8320, r8323, MPFR_RNDN);
        mpfr_div(r8325, r8318, r8324, MPFR_RNDN);
        return mpfr_get_d(r8325, MPFR_RNDN);
}

static mpfr_t r8326, r8327, r8328, r8329, r8330, r8331, r8332, r8333;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init_set_str(r8326, "1", 10, MPFR_RNDN);
        mpfr_init(r8327);
        mpfr_init(r8328);
        mpfr_init(r8329);
        mpfr_init(r8330);
        mpfr_init(r8331);
        mpfr_init(r8332);
        mpfr_init(r8333);
}

double f_dm(double re, double im, double base) {
        ;
        mpfr_set_d(r8327, base, MPFR_RNDN);
        mpfr_log(r8328, r8327, MPFR_RNDN);
        mpfr_set_d(r8329, im, MPFR_RNDN);
        mpfr_set_d(r8330, re, MPFR_RNDN);
        mpfr_atan2(r8331, r8329, r8330, MPFR_RNDN);
        mpfr_div(r8332, r8328, r8331, MPFR_RNDN);
        mpfr_div(r8333, r8326, r8332, MPFR_RNDN);
        return mpfr_get_d(r8333, MPFR_RNDN);
}

