#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 r30055 = x;
        float r30056 = log(r30055);
        float r30057 = log(r30056);
        float r30058 = r30056 - r30057;
        return r30058;
}

double f_id(double x) {
        double r30059 = x;
        double r30060 = log(r30059);
        double r30061 = log(r30060);
        double r30062 = r30060 - r30061;
        return r30062;
}


double f_of(float x) {
        float r30063 = x;
        float r30064 = log(r30063);
        float r30065 = r30063 / r30064;
        float r30066 = log(r30065);
        return r30066;
}

double f_od(double x) {
        double r30067 = x;
        double r30068 = log(r30067);
        double r30069 = r30067 / r30068;
        double r30070 = log(r30069);
        return r30070;
}

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 r30071, r30072, r30073, r30074;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r30071);
        mpfr_init(r30072);
        mpfr_init(r30073);
        mpfr_init(r30074);
}

double f_im(double x) {
        mpfr_set_d(r30071, x, MPFR_RNDN);
        mpfr_log(r30072, r30071, MPFR_RNDN);
        mpfr_log(r30073, r30072, MPFR_RNDN);
        mpfr_sub(r30074, r30072, r30073, MPFR_RNDN);
        return mpfr_get_d(r30074, MPFR_RNDN);
}

static mpfr_t r30075, r30076, r30077, r30078;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r30075);
        mpfr_init(r30076);
        mpfr_init(r30077);
        mpfr_init(r30078);
}

double f_fm(double x) {
        mpfr_set_d(r30075, x, MPFR_RNDN);
        mpfr_log(r30076, r30075, MPFR_RNDN);
        mpfr_div(r30077, r30075, r30076, MPFR_RNDN);
        mpfr_log(r30078, r30077, MPFR_RNDN);
        return mpfr_get_d(r30078, MPFR_RNDN);
}

static mpfr_t r30079, r30080, r30081, r30082;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r30079);
        mpfr_init(r30080);
        mpfr_init(r30081);
        mpfr_init(r30082);
}

double f_dm(double x) {
        mpfr_set_d(r30079, x, MPFR_RNDN);
        mpfr_log(r30080, r30079, MPFR_RNDN);
        mpfr_div(r30081, r30079, r30080, MPFR_RNDN);
        mpfr_log(r30082, r30081, MPFR_RNDN);
        return mpfr_get_d(r30082, MPFR_RNDN);
}

