#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 r8862 = im;
        float r8863 = re;
        float r8864 = atan2(r8862, r8863);
        float r8865 = base;
        float r8866 = log(r8865);
        float r8867 = r8864 * r8866;
        float r8868 = r8863 * r8863;
        float r8869 = r8862 * r8862;
        float r8870 = r8868 + r8869;
        float r8871 = sqrt(r8870);
        float r8872 = log(r8871);
        float r8873 = 0.0f;
        float r8874 = r8872 * r8873;
        float r8875 = r8867 - r8874;
        float r8876 = r8866 * r8866;
        float r8877 = r8873 * r8873;
        float r8878 = r8876 + r8877;
        float r8879 = r8875 / r8878;
        return r8879;
}

double f_id(double re, double im, double base) {
        double r8880 = im;
        double r8881 = re;
        double r8882 = atan2(r8880, r8881);
        double r8883 = base;
        double r8884 = log(r8883);
        double r8885 = r8882 * r8884;
        double r8886 = r8881 * r8881;
        double r8887 = r8880 * r8880;
        double r8888 = r8886 + r8887;
        double r8889 = sqrt(r8888);
        double r8890 = log(r8889);
        double r8891 = 0.0;
        double r8892 = r8890 * r8891;
        double r8893 = r8885 - r8892;
        double r8894 = r8884 * r8884;
        double r8895 = r8891 * r8891;
        double r8896 = r8894 + r8895;
        double r8897 = r8893 / r8896;
        return r8897;
}


double f_of(float re, float im, float base) {
        float r8898 = im;
        float r8899 = re;
        float r8900 = atan2(r8898, r8899);
        float r8901 = base;
        float r8902 = log(r8901);
        float r8903 = r8900 / r8902;
        return r8903;
}

double f_od(double re, double im, double base) {
        double r8904 = im;
        double r8905 = re;
        double r8906 = atan2(r8904, r8905);
        double r8907 = base;
        double r8908 = log(r8907);
        double r8909 = r8906 / r8908;
        return r8909;
}

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 r8910, r8911, r8912, r8913, r8914, r8915, r8916, r8917, r8918, r8919, r8920, r8921, r8922, r8923, r8924, r8925, r8926, r8927;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r8910);
        mpfr_init(r8911);
        mpfr_init(r8912);
        mpfr_init(r8913);
        mpfr_init(r8914);
        mpfr_init(r8915);
        mpfr_init(r8916);
        mpfr_init(r8917);
        mpfr_init(r8918);
        mpfr_init(r8919);
        mpfr_init(r8920);
        mpfr_init_set_str(r8921, "0", 10, MPFR_RNDN);
        mpfr_init(r8922);
        mpfr_init(r8923);
        mpfr_init(r8924);
        mpfr_init(r8925);
        mpfr_init(r8926);
        mpfr_init(r8927);
}

double f_im(double re, double im, double base) {
        mpfr_set_d(r8910, im, MPFR_RNDN);
        mpfr_set_d(r8911, re, MPFR_RNDN);
        mpfr_atan2(r8912, r8910, r8911, MPFR_RNDN);
        mpfr_set_d(r8913, base, MPFR_RNDN);
        mpfr_log(r8914, r8913, MPFR_RNDN);
        mpfr_mul(r8915, r8912, r8914, MPFR_RNDN);
        mpfr_mul(r8916, r8911, r8911, MPFR_RNDN);
        mpfr_mul(r8917, r8910, r8910, MPFR_RNDN);
        mpfr_add(r8918, r8916, r8917, MPFR_RNDN);
        mpfr_sqrt(r8919, r8918, MPFR_RNDN);
        mpfr_log(r8920, r8919, MPFR_RNDN);
        ;
        mpfr_mul(r8922, r8920, r8921, MPFR_RNDN);
        mpfr_sub(r8923, r8915, r8922, MPFR_RNDN);
        mpfr_mul(r8924, r8914, r8914, MPFR_RNDN);
        mpfr_mul(r8925, r8921, r8921, MPFR_RNDN);
        mpfr_add(r8926, r8924, r8925, MPFR_RNDN);
        mpfr_div(r8927, r8923, r8926, MPFR_RNDN);
        return mpfr_get_d(r8927, MPFR_RNDN);
}

static mpfr_t r8928, r8929, r8930, r8931, r8932, r8933;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8928);
        mpfr_init(r8929);
        mpfr_init(r8930);
        mpfr_init(r8931);
        mpfr_init(r8932);
        mpfr_init(r8933);
}

double f_fm(double re, double im, double base) {
        mpfr_set_d(r8928, im, MPFR_RNDN);
        mpfr_set_d(r8929, re, MPFR_RNDN);
        mpfr_atan2(r8930, r8928, r8929, MPFR_RNDN);
        mpfr_set_d(r8931, base, MPFR_RNDN);
        mpfr_log(r8932, r8931, MPFR_RNDN);
        mpfr_div(r8933, r8930, r8932, MPFR_RNDN);
        return mpfr_get_d(r8933, MPFR_RNDN);
}

static mpfr_t r8934, r8935, r8936, r8937, r8938, r8939;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8934);
        mpfr_init(r8935);
        mpfr_init(r8936);
        mpfr_init(r8937);
        mpfr_init(r8938);
        mpfr_init(r8939);
}

double f_dm(double re, double im, double base) {
        mpfr_set_d(r8934, im, MPFR_RNDN);
        mpfr_set_d(r8935, re, MPFR_RNDN);
        mpfr_atan2(r8936, r8934, r8935, MPFR_RNDN);
        mpfr_set_d(r8937, base, MPFR_RNDN);
        mpfr_log(r8938, r8937, MPFR_RNDN);
        mpfr_div(r8939, r8936, r8938, MPFR_RNDN);
        return mpfr_get_d(r8939, MPFR_RNDN);
}

