#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 r8927 = im;
        float r8928 = re;
        float r8929 = atan2(r8927, r8928);
        float r8930 = base;
        float r8931 = log(r8930);
        float r8932 = r8929 * r8931;
        float r8933 = r8928 * r8928;
        float r8934 = r8927 * r8927;
        float r8935 = r8933 + r8934;
        float r8936 = sqrt(r8935);
        float r8937 = log(r8936);
        float r8938 = 0;
        float r8939 = r8937 * r8938;
        float r8940 = r8932 - r8939;
        float r8941 = r8931 * r8931;
        float r8942 = r8938 * r8938;
        float r8943 = r8941 + r8942;
        float r8944 = r8940 / r8943;
        return r8944;
}

double f_id(double re, double im, double base) {
        double r8945 = im;
        double r8946 = re;
        double r8947 = atan2(r8945, r8946);
        double r8948 = base;
        double r8949 = log(r8948);
        double r8950 = r8947 * r8949;
        double r8951 = r8946 * r8946;
        double r8952 = r8945 * r8945;
        double r8953 = r8951 + r8952;
        double r8954 = sqrt(r8953);
        double r8955 = log(r8954);
        double r8956 = 0;
        double r8957 = r8955 * r8956;
        double r8958 = r8950 - r8957;
        double r8959 = r8949 * r8949;
        double r8960 = r8956 * r8956;
        double r8961 = r8959 + r8960;
        double r8962 = r8958 / r8961;
        return r8962;
}


double f_of(float re, float im, float base) {
        float r8963 = im;
        float r8964 = re;
        float r8965 = atan2(r8963, r8964);
        float r8966 = base;
        float r8967 = log(r8966);
        float r8968 = r8965 / r8967;
        return r8968;
}

double f_od(double re, double im, double base) {
        double r8969 = im;
        double r8970 = re;
        double r8971 = atan2(r8969, r8970);
        double r8972 = base;
        double r8973 = log(r8972);
        double r8974 = r8971 / r8973;
        return r8974;
}

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 r8975, r8976, r8977, r8978, r8979, r8980, r8981, r8982, r8983, r8984, r8985, r8986, r8987, r8988, r8989, r8990, r8991, r8992;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r8975);
        mpfr_init(r8976);
        mpfr_init(r8977);
        mpfr_init(r8978);
        mpfr_init(r8979);
        mpfr_init(r8980);
        mpfr_init(r8981);
        mpfr_init(r8982);
        mpfr_init(r8983);
        mpfr_init(r8984);
        mpfr_init(r8985);
        mpfr_init_set_str(r8986, "0", 10, MPFR_RNDN);
        mpfr_init(r8987);
        mpfr_init(r8988);
        mpfr_init(r8989);
        mpfr_init(r8990);
        mpfr_init(r8991);
        mpfr_init(r8992);
}

double f_im(double re, double im, double base) {
        mpfr_set_d(r8975, im, MPFR_RNDN);
        mpfr_set_d(r8976, re, MPFR_RNDN);
        mpfr_atan2(r8977, r8975, r8976, MPFR_RNDN);
        mpfr_set_d(r8978, base, MPFR_RNDN);
        mpfr_log(r8979, r8978, MPFR_RNDN);
        mpfr_mul(r8980, r8977, r8979, MPFR_RNDN);
        mpfr_mul(r8981, r8976, r8976, MPFR_RNDN);
        mpfr_mul(r8982, r8975, r8975, MPFR_RNDN);
        mpfr_add(r8983, r8981, r8982, MPFR_RNDN);
        mpfr_sqrt(r8984, r8983, MPFR_RNDN);
        mpfr_log(r8985, r8984, MPFR_RNDN);
        ;
        mpfr_mul(r8987, r8985, r8986, MPFR_RNDN);
        mpfr_sub(r8988, r8980, r8987, MPFR_RNDN);
        mpfr_mul(r8989, r8979, r8979, MPFR_RNDN);
        mpfr_mul(r8990, r8986, r8986, MPFR_RNDN);
        mpfr_add(r8991, r8989, r8990, MPFR_RNDN);
        mpfr_div(r8992, r8988, r8991, MPFR_RNDN);
        return mpfr_get_d(r8992, MPFR_RNDN);
}

static mpfr_t r8993, r8994, r8995, r8996, r8997, r8998;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8993);
        mpfr_init(r8994);
        mpfr_init(r8995);
        mpfr_init(r8996);
        mpfr_init(r8997);
        mpfr_init(r8998);
}

double f_fm(double re, double im, double base) {
        mpfr_set_d(r8993, im, MPFR_RNDN);
        mpfr_set_d(r8994, re, MPFR_RNDN);
        mpfr_atan2(r8995, r8993, r8994, MPFR_RNDN);
        mpfr_set_d(r8996, base, MPFR_RNDN);
        mpfr_log(r8997, r8996, MPFR_RNDN);
        mpfr_div(r8998, r8995, r8997, MPFR_RNDN);
        return mpfr_get_d(r8998, MPFR_RNDN);
}

static mpfr_t r8999, r9000, r9001, r9002, r9003, r9004;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8999);
        mpfr_init(r9000);
        mpfr_init(r9001);
        mpfr_init(r9002);
        mpfr_init(r9003);
        mpfr_init(r9004);
}

double f_dm(double re, double im, double base) {
        mpfr_set_d(r8999, im, MPFR_RNDN);
        mpfr_set_d(r9000, re, MPFR_RNDN);
        mpfr_atan2(r9001, r8999, r9000, MPFR_RNDN);
        mpfr_set_d(r9002, base, MPFR_RNDN);
        mpfr_log(r9003, r9002, MPFR_RNDN);
        mpfr_div(r9004, r9001, r9003, MPFR_RNDN);
        return mpfr_get_d(r9004, MPFR_RNDN);
}

