#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 r8627 = im;
        float r8628 = re;
        float r8629 = atan2(r8627, r8628);
        float r8630 = base;
        float r8631 = log(r8630);
        float r8632 = r8629 * r8631;
        float r8633 = r8628 * r8628;
        float r8634 = r8627 * r8627;
        float r8635 = r8633 + r8634;
        float r8636 = sqrt(r8635);
        float r8637 = log(r8636);
        float r8638 = 0;
        float r8639 = r8637 * r8638;
        float r8640 = r8632 - r8639;
        float r8641 = r8631 * r8631;
        float r8642 = r8638 * r8638;
        float r8643 = r8641 + r8642;
        float r8644 = r8640 / r8643;
        return r8644;
}

double f_id(double re, double im, double base) {
        double r8645 = im;
        double r8646 = re;
        double r8647 = atan2(r8645, r8646);
        double r8648 = base;
        double r8649 = log(r8648);
        double r8650 = r8647 * r8649;
        double r8651 = r8646 * r8646;
        double r8652 = r8645 * r8645;
        double r8653 = r8651 + r8652;
        double r8654 = sqrt(r8653);
        double r8655 = log(r8654);
        double r8656 = 0;
        double r8657 = r8655 * r8656;
        double r8658 = r8650 - r8657;
        double r8659 = r8649 * r8649;
        double r8660 = r8656 * r8656;
        double r8661 = r8659 + r8660;
        double r8662 = r8658 / r8661;
        return r8662;
}


double f_of(float re, float im, float base) {
        float r8663 = im;
        float r8664 = re;
        float r8665 = atan2(r8663, r8664);
        float r8666 = base;
        float r8667 = log(r8666);
        float r8668 = r8665 / r8667;
        return r8668;
}

double f_od(double re, double im, double base) {
        double r8669 = im;
        double r8670 = re;
        double r8671 = atan2(r8669, r8670);
        double r8672 = base;
        double r8673 = log(r8672);
        double r8674 = r8671 / r8673;
        return r8674;
}

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 r8675, r8676, r8677, r8678, r8679, r8680, r8681, r8682, r8683, r8684, r8685, r8686, r8687, r8688, r8689, r8690, r8691, r8692;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r8675);
        mpfr_init(r8676);
        mpfr_init(r8677);
        mpfr_init(r8678);
        mpfr_init(r8679);
        mpfr_init(r8680);
        mpfr_init(r8681);
        mpfr_init(r8682);
        mpfr_init(r8683);
        mpfr_init(r8684);
        mpfr_init(r8685);
        mpfr_init_set_str(r8686, "0", 10, MPFR_RNDN);
        mpfr_init(r8687);
        mpfr_init(r8688);
        mpfr_init(r8689);
        mpfr_init(r8690);
        mpfr_init(r8691);
        mpfr_init(r8692);
}

double f_im(double re, double im, double base) {
        mpfr_set_d(r8675, im, MPFR_RNDN);
        mpfr_set_d(r8676, re, MPFR_RNDN);
        mpfr_atan2(r8677, r8675, r8676, MPFR_RNDN);
        mpfr_set_d(r8678, base, MPFR_RNDN);
        mpfr_log(r8679, r8678, MPFR_RNDN);
        mpfr_mul(r8680, r8677, r8679, MPFR_RNDN);
        mpfr_mul(r8681, r8676, r8676, MPFR_RNDN);
        mpfr_mul(r8682, r8675, r8675, MPFR_RNDN);
        mpfr_add(r8683, r8681, r8682, MPFR_RNDN);
        mpfr_sqrt(r8684, r8683, MPFR_RNDN);
        mpfr_log(r8685, r8684, MPFR_RNDN);
        ;
        mpfr_mul(r8687, r8685, r8686, MPFR_RNDN);
        mpfr_sub(r8688, r8680, r8687, MPFR_RNDN);
        mpfr_mul(r8689, r8679, r8679, MPFR_RNDN);
        mpfr_mul(r8690, r8686, r8686, MPFR_RNDN);
        mpfr_add(r8691, r8689, r8690, MPFR_RNDN);
        mpfr_div(r8692, r8688, r8691, MPFR_RNDN);
        return mpfr_get_d(r8692, MPFR_RNDN);
}

static mpfr_t r8693, r8694, r8695, r8696, r8697, r8698;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8693);
        mpfr_init(r8694);
        mpfr_init(r8695);
        mpfr_init(r8696);
        mpfr_init(r8697);
        mpfr_init(r8698);
}

double f_fm(double re, double im, double base) {
        mpfr_set_d(r8693, im, MPFR_RNDN);
        mpfr_set_d(r8694, re, MPFR_RNDN);
        mpfr_atan2(r8695, r8693, r8694, MPFR_RNDN);
        mpfr_set_d(r8696, base, MPFR_RNDN);
        mpfr_log(r8697, r8696, MPFR_RNDN);
        mpfr_div(r8698, r8695, r8697, MPFR_RNDN);
        return mpfr_get_d(r8698, MPFR_RNDN);
}

static mpfr_t r8699, r8700, r8701, r8702, r8703, r8704;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8699);
        mpfr_init(r8700);
        mpfr_init(r8701);
        mpfr_init(r8702);
        mpfr_init(r8703);
        mpfr_init(r8704);
}

double f_dm(double re, double im, double base) {
        mpfr_set_d(r8699, im, MPFR_RNDN);
        mpfr_set_d(r8700, re, MPFR_RNDN);
        mpfr_atan2(r8701, r8699, r8700, MPFR_RNDN);
        mpfr_set_d(r8702, base, MPFR_RNDN);
        mpfr_log(r8703, r8702, MPFR_RNDN);
        mpfr_div(r8704, r8701, r8703, MPFR_RNDN);
        return mpfr_get_d(r8704, MPFR_RNDN);
}

