#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 r8884 = im;
        float r8885 = re;
        float r8886 = atan2(r8884, r8885);
        float r8887 = base;
        float r8888 = log(r8887);
        float r8889 = r8886 * r8888;
        float r8890 = r8885 * r8885;
        float r8891 = r8884 * r8884;
        float r8892 = r8890 + r8891;
        float r8893 = sqrt(r8892);
        float r8894 = log(r8893);
        float r8895 = 0.0f;
        float r8896 = r8894 * r8895;
        float r8897 = r8889 - r8896;
        float r8898 = r8888 * r8888;
        float r8899 = r8895 * r8895;
        float r8900 = r8898 + r8899;
        float r8901 = r8897 / r8900;
        return r8901;
}

double f_id(double re, double im, double base) {
        double r8902 = im;
        double r8903 = re;
        double r8904 = atan2(r8902, r8903);
        double r8905 = base;
        double r8906 = log(r8905);
        double r8907 = r8904 * r8906;
        double r8908 = r8903 * r8903;
        double r8909 = r8902 * r8902;
        double r8910 = r8908 + r8909;
        double r8911 = sqrt(r8910);
        double r8912 = log(r8911);
        double r8913 = 0.0;
        double r8914 = r8912 * r8913;
        double r8915 = r8907 - r8914;
        double r8916 = r8906 * r8906;
        double r8917 = r8913 * r8913;
        double r8918 = r8916 + r8917;
        double r8919 = r8915 / r8918;
        return r8919;
}


double f_of(float re, float im, float base) {
        float r8920 = 1.0f;
        float r8921 = base;
        float r8922 = log(r8921);
        float r8923 = im;
        float r8924 = re;
        float r8925 = atan2(r8923, r8924);
        float r8926 = r8922 / r8925;
        float r8927 = r8920 / r8926;
        return r8927;
}

double f_od(double re, double im, double base) {
        double r8928 = 1.0;
        double r8929 = base;
        double r8930 = log(r8929);
        double r8931 = im;
        double r8932 = re;
        double r8933 = atan2(r8931, r8932);
        double r8934 = r8930 / r8933;
        double r8935 = r8928 / r8934;
        return r8935;
}

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 r8936, r8937, r8938, r8939, r8940, r8941, r8942, r8943, r8944, r8945, r8946, r8947, r8948, r8949, r8950, r8951, r8952, r8953;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r8936);
        mpfr_init(r8937);
        mpfr_init(r8938);
        mpfr_init(r8939);
        mpfr_init(r8940);
        mpfr_init(r8941);
        mpfr_init(r8942);
        mpfr_init(r8943);
        mpfr_init(r8944);
        mpfr_init(r8945);
        mpfr_init(r8946);
        mpfr_init_set_str(r8947, "0", 10, MPFR_RNDN);
        mpfr_init(r8948);
        mpfr_init(r8949);
        mpfr_init(r8950);
        mpfr_init(r8951);
        mpfr_init(r8952);
        mpfr_init(r8953);
}

double f_im(double re, double im, double base) {
        mpfr_set_d(r8936, im, MPFR_RNDN);
        mpfr_set_d(r8937, re, MPFR_RNDN);
        mpfr_atan2(r8938, r8936, r8937, MPFR_RNDN);
        mpfr_set_d(r8939, base, MPFR_RNDN);
        mpfr_log(r8940, r8939, MPFR_RNDN);
        mpfr_mul(r8941, r8938, r8940, MPFR_RNDN);
        mpfr_mul(r8942, r8937, r8937, MPFR_RNDN);
        mpfr_mul(r8943, r8936, r8936, MPFR_RNDN);
        mpfr_add(r8944, r8942, r8943, MPFR_RNDN);
        mpfr_sqrt(r8945, r8944, MPFR_RNDN);
        mpfr_log(r8946, r8945, MPFR_RNDN);
        ;
        mpfr_mul(r8948, r8946, r8947, MPFR_RNDN);
        mpfr_sub(r8949, r8941, r8948, MPFR_RNDN);
        mpfr_mul(r8950, r8940, r8940, MPFR_RNDN);
        mpfr_mul(r8951, r8947, r8947, MPFR_RNDN);
        mpfr_add(r8952, r8950, r8951, MPFR_RNDN);
        mpfr_div(r8953, r8949, r8952, MPFR_RNDN);
        return mpfr_get_d(r8953, MPFR_RNDN);
}

static mpfr_t r8954, r8955, r8956, r8957, r8958, r8959, r8960, r8961;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init_set_str(r8954, "1", 10, MPFR_RNDN);
        mpfr_init(r8955);
        mpfr_init(r8956);
        mpfr_init(r8957);
        mpfr_init(r8958);
        mpfr_init(r8959);
        mpfr_init(r8960);
        mpfr_init(r8961);
}

double f_fm(double re, double im, double base) {
        ;
        mpfr_set_d(r8955, base, MPFR_RNDN);
        mpfr_log(r8956, r8955, MPFR_RNDN);
        mpfr_set_d(r8957, im, MPFR_RNDN);
        mpfr_set_d(r8958, re, MPFR_RNDN);
        mpfr_atan2(r8959, r8957, r8958, MPFR_RNDN);
        mpfr_div(r8960, r8956, r8959, MPFR_RNDN);
        mpfr_div(r8961, r8954, r8960, MPFR_RNDN);
        return mpfr_get_d(r8961, MPFR_RNDN);
}

static mpfr_t r8962, r8963, r8964, r8965, r8966, r8967, r8968, r8969;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init_set_str(r8962, "1", 10, MPFR_RNDN);
        mpfr_init(r8963);
        mpfr_init(r8964);
        mpfr_init(r8965);
        mpfr_init(r8966);
        mpfr_init(r8967);
        mpfr_init(r8968);
        mpfr_init(r8969);
}

double f_dm(double re, double im, double base) {
        ;
        mpfr_set_d(r8963, base, MPFR_RNDN);
        mpfr_log(r8964, r8963, MPFR_RNDN);
        mpfr_set_d(r8965, im, MPFR_RNDN);
        mpfr_set_d(r8966, re, MPFR_RNDN);
        mpfr_atan2(r8967, r8965, r8966, MPFR_RNDN);
        mpfr_div(r8968, r8964, r8967, MPFR_RNDN);
        mpfr_div(r8969, r8962, r8968, MPFR_RNDN);
        return mpfr_get_d(r8969, MPFR_RNDN);
}

