#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 r17991 = x;
        float r17992 = log(r17991);
        float r17993 = log(r17992);
        float r17994 = r17992 - r17993;
        return r17994;
}

double f_id(double x) {
        double r17995 = x;
        double r17996 = log(r17995);
        double r17997 = log(r17996);
        double r17998 = r17996 - r17997;
        return r17998;
}


double f_of(float x) {
        float r17999 = x;
        float r18000 = log(r17999);
        float r18001 = r17999 / r18000;
        float r18002 = log(r18001);
        return r18002;
}

double f_od(double x) {
        double r18003 = x;
        double r18004 = log(r18003);
        double r18005 = r18003 / r18004;
        double r18006 = log(r18005);
        return r18006;
}

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 r18007, r18008, r18009, r18010;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r18007);
        mpfr_init(r18008);
        mpfr_init(r18009);
        mpfr_init(r18010);
}

double f_im(double x) {
        mpfr_set_d(r18007, x, MPFR_RNDN);
        mpfr_log(r18008, r18007, MPFR_RNDN);
        mpfr_log(r18009, r18008, MPFR_RNDN);
        mpfr_sub(r18010, r18008, r18009, MPFR_RNDN);
        return mpfr_get_d(r18010, MPFR_RNDN);
}

static mpfr_t r18011, r18012, r18013, r18014;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r18011);
        mpfr_init(r18012);
        mpfr_init(r18013);
        mpfr_init(r18014);
}

double f_fm(double x) {
        mpfr_set_d(r18011, x, MPFR_RNDN);
        mpfr_log(r18012, r18011, MPFR_RNDN);
        mpfr_div(r18013, r18011, r18012, MPFR_RNDN);
        mpfr_log(r18014, r18013, MPFR_RNDN);
        return mpfr_get_d(r18014, MPFR_RNDN);
}

static mpfr_t r18015, r18016, r18017, r18018;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r18015);
        mpfr_init(r18016);
        mpfr_init(r18017);
        mpfr_init(r18018);
}

double f_dm(double x) {
        mpfr_set_d(r18015, x, MPFR_RNDN);
        mpfr_log(r18016, r18015, MPFR_RNDN);
        mpfr_div(r18017, r18015, r18016, MPFR_RNDN);
        mpfr_log(r18018, r18017, MPFR_RNDN);
        return mpfr_get_d(r18018, MPFR_RNDN);
}

