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

char *name = "Jmat.Real.lambertw, estimator";

double f_if(float x) {
        float r56507754 = x;
        float r56507755 = log(r56507754);
        float r56507756 = log(r56507755);
        float r56507757 = r56507755 - r56507756;
        return r56507757;
}

double f_id(double x) {
        double r56507758 = x;
        double r56507759 = log(r56507758);
        double r56507760 = log(r56507759);
        double r56507761 = r56507759 - r56507760;
        return r56507761;
}


double f_of(float x) {
        float r56507762 = x;
        float r56507763 = log(r56507762);
        float r56507764 = r56507762 / r56507763;
        float r56507765 = log(r56507764);
        return r56507765;
}

double f_od(double x) {
        double r56507766 = x;
        double r56507767 = log(r56507766);
        double r56507768 = r56507766 / r56507767;
        double r56507769 = log(r56507768);
        return r56507769;
}

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 r56507770, r56507771, r56507772, r56507773;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r56507770);
        mpfr_init(r56507771);
        mpfr_init(r56507772);
        mpfr_init(r56507773);
}

double f_im(double x) {
        mpfr_set_d(r56507770, x, MPFR_RNDN);
        mpfr_log(r56507771, r56507770, MPFR_RNDN);
        mpfr_log(r56507772, r56507771, MPFR_RNDN);
        mpfr_sub(r56507773, r56507771, r56507772, MPFR_RNDN);
        return mpfr_get_d(r56507773, MPFR_RNDN);
}

static mpfr_t r56507774, r56507775, r56507776, r56507777;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r56507774);
        mpfr_init(r56507775);
        mpfr_init(r56507776);
        mpfr_init(r56507777);
}

double f_fm(double x) {
        mpfr_set_d(r56507774, x, MPFR_RNDN);
        mpfr_log(r56507775, r56507774, MPFR_RNDN);
        mpfr_div(r56507776, r56507774, r56507775, MPFR_RNDN);
        mpfr_log(r56507777, r56507776, MPFR_RNDN);
        return mpfr_get_d(r56507777, MPFR_RNDN);
}

static mpfr_t r56507778, r56507779, r56507780, r56507781;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r56507778);
        mpfr_init(r56507779);
        mpfr_init(r56507780);
        mpfr_init(r56507781);
}

double f_dm(double x) {
        mpfr_set_d(r56507778, x, MPFR_RNDN);
        mpfr_log(r56507779, r56507778, MPFR_RNDN);
        mpfr_div(r56507780, r56507778, r56507779, MPFR_RNDN);
        mpfr_log(r56507781, r56507780, MPFR_RNDN);
        return mpfr_get_d(r56507781, MPFR_RNDN);
}

