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

char *name = "Jmat.Real.lambertw, newton loop step";

double f_if(float wj, float x) {
        float r28198 = wj;
        float r28199 = exp(r28198);
        float r28200 = r28198 * r28199;
        float r28201 = x;
        float r28202 = r28200 - r28201;
        float r28203 = r28199 + r28200;
        float r28204 = r28202 / r28203;
        float r28205 = r28198 - r28204;
        return r28205;
}

double f_id(double wj, double x) {
        double r28206 = wj;
        double r28207 = exp(r28206);
        double r28208 = r28206 * r28207;
        double r28209 = x;
        double r28210 = r28208 - r28209;
        double r28211 = r28207 + r28208;
        double r28212 = r28210 / r28211;
        double r28213 = r28206 - r28212;
        return r28213;
}


double f_of(float wj, float x) {
        float r28214 = x;
        float r28215 = wj;
        float r28216 = exp(r28215);
        float r28217 = r28214 / r28216;
        float r28218 = 1;
        float r28219 = r28218 + r28215;
        float r28220 = r28217 / r28219;
        float r28221 = 4;
        float r28222 = pow(r28215, r28221);
        float r28223 = r28218 - r28215;
        float r28224 = r28215 * r28215;
        float r28225 = r28223 * r28224;
        float r28226 = r28222 + r28225;
        float r28227 = r28220 + r28226;
        float r28228 = 5.197092220811776e-19;
        bool r28229 = r28227 <= r28228;
        float r28230 = r28215 / r28219;
        float r28231 = r28215 - r28230;
        float r28232 = r28215 * r28216;
        float r28233 = r28216 + r28232;
        float r28234 = r28214 / r28233;
        float r28235 = r28231 + r28234;
        float r28236 = r28229 ? r28227 : r28235;
        return r28236;
}

double f_od(double wj, double x) {
        double r28237 = x;
        double r28238 = wj;
        double r28239 = exp(r28238);
        double r28240 = r28237 / r28239;
        double r28241 = 1;
        double r28242 = r28241 + r28238;
        double r28243 = r28240 / r28242;
        double r28244 = 4;
        double r28245 = pow(r28238, r28244);
        double r28246 = r28241 - r28238;
        double r28247 = r28238 * r28238;
        double r28248 = r28246 * r28247;
        double r28249 = r28245 + r28248;
        double r28250 = r28243 + r28249;
        double r28251 = 5.197092220811776e-19;
        bool r28252 = r28250 <= r28251;
        double r28253 = r28238 / r28242;
        double r28254 = r28238 - r28253;
        double r28255 = r28238 * r28239;
        double r28256 = r28239 + r28255;
        double r28257 = r28237 / r28256;
        double r28258 = r28254 + r28257;
        double r28259 = r28252 ? r28250 : r28258;
        return r28259;
}

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 r28260, r28261, r28262, r28263, r28264, r28265, r28266, r28267;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(848);
        mpfr_init(r28260);
        mpfr_init(r28261);
        mpfr_init(r28262);
        mpfr_init(r28263);
        mpfr_init(r28264);
        mpfr_init(r28265);
        mpfr_init(r28266);
        mpfr_init(r28267);
}

double f_im(double wj, double x) {
        mpfr_set_d(r28260, wj, MPFR_RNDN);
        mpfr_exp(r28261, r28260, MPFR_RNDN);
        mpfr_mul(r28262, r28260, r28261, MPFR_RNDN);
        mpfr_set_d(r28263, x, MPFR_RNDN);
        mpfr_sub(r28264, r28262, r28263, MPFR_RNDN);
        mpfr_add(r28265, r28261, r28262, MPFR_RNDN);
        mpfr_div(r28266, r28264, r28265, MPFR_RNDN);
        mpfr_sub(r28267, r28260, r28266, MPFR_RNDN);
        return mpfr_get_d(r28267, MPFR_RNDN);
}

static mpfr_t r28268, r28269, r28270, r28271, r28272, r28273, r28274, r28275, r28276, r28277, r28278, r28279, r28280, r28281, r28282, r28283, r28284, r28285, r28286, r28287, r28288, r28289, r28290;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(848);
        mpfr_init(r28268);
        mpfr_init(r28269);
        mpfr_init(r28270);
        mpfr_init(r28271);
        mpfr_init_set_str(r28272, "1", 10, MPFR_RNDN);
        mpfr_init(r28273);
        mpfr_init(r28274);
        mpfr_init_set_str(r28275, "4", 10, MPFR_RNDN);
        mpfr_init(r28276);
        mpfr_init(r28277);
        mpfr_init(r28278);
        mpfr_init(r28279);
        mpfr_init(r28280);
        mpfr_init(r28281);
        mpfr_init_set_str(r28282, "5.197092220811776e-19", 10, MPFR_RNDN);
        mpfr_init(r28283);
        mpfr_init(r28284);
        mpfr_init(r28285);
        mpfr_init(r28286);
        mpfr_init(r28287);
        mpfr_init(r28288);
        mpfr_init(r28289);
        mpfr_init(r28290);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r28268, x, MPFR_RNDN);
        mpfr_set_d(r28269, wj, MPFR_RNDN);
        mpfr_exp(r28270, r28269, MPFR_RNDN);
        mpfr_div(r28271, r28268, r28270, MPFR_RNDN);
        ;
        mpfr_add(r28273, r28272, r28269, MPFR_RNDN);
        mpfr_div(r28274, r28271, r28273, MPFR_RNDN);
        ;
        mpfr_pow(r28276, r28269, r28275, MPFR_RNDN);
        mpfr_sub(r28277, r28272, r28269, MPFR_RNDN);
        mpfr_mul(r28278, r28269, r28269, MPFR_RNDN);
        mpfr_mul(r28279, r28277, r28278, MPFR_RNDN);
        mpfr_add(r28280, r28276, r28279, MPFR_RNDN);
        mpfr_add(r28281, r28274, r28280, MPFR_RNDN);
        ;
        mpfr_set_si(r28283, mpfr_cmp(r28281, r28282) <= 0, MPFR_RNDN);
        mpfr_div(r28284, r28269, r28273, MPFR_RNDN);
        mpfr_sub(r28285, r28269, r28284, MPFR_RNDN);
        mpfr_mul(r28286, r28269, r28270, MPFR_RNDN);
        mpfr_add(r28287, r28270, r28286, MPFR_RNDN);
        mpfr_div(r28288, r28268, r28287, MPFR_RNDN);
        mpfr_add(r28289, r28285, r28288, MPFR_RNDN);
        if (mpfr_get_si(r28283, MPFR_RNDN)) { mpfr_set(r28290, r28281, MPFR_RNDN); } else { mpfr_set(r28290, r28289, MPFR_RNDN); };
        return mpfr_get_d(r28290, MPFR_RNDN);
}

static mpfr_t r28291, r28292, r28293, r28294, r28295, r28296, r28297, r28298, r28299, r28300, r28301, r28302, r28303, r28304, r28305, r28306, r28307, r28308, r28309, r28310, r28311, r28312, r28313;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(848);
        mpfr_init(r28291);
        mpfr_init(r28292);
        mpfr_init(r28293);
        mpfr_init(r28294);
        mpfr_init_set_str(r28295, "1", 10, MPFR_RNDN);
        mpfr_init(r28296);
        mpfr_init(r28297);
        mpfr_init_set_str(r28298, "4", 10, MPFR_RNDN);
        mpfr_init(r28299);
        mpfr_init(r28300);
        mpfr_init(r28301);
        mpfr_init(r28302);
        mpfr_init(r28303);
        mpfr_init(r28304);
        mpfr_init_set_str(r28305, "5.197092220811776e-19", 10, MPFR_RNDN);
        mpfr_init(r28306);
        mpfr_init(r28307);
        mpfr_init(r28308);
        mpfr_init(r28309);
        mpfr_init(r28310);
        mpfr_init(r28311);
        mpfr_init(r28312);
        mpfr_init(r28313);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r28291, x, MPFR_RNDN);
        mpfr_set_d(r28292, wj, MPFR_RNDN);
        mpfr_exp(r28293, r28292, MPFR_RNDN);
        mpfr_div(r28294, r28291, r28293, MPFR_RNDN);
        ;
        mpfr_add(r28296, r28295, r28292, MPFR_RNDN);
        mpfr_div(r28297, r28294, r28296, MPFR_RNDN);
        ;
        mpfr_pow(r28299, r28292, r28298, MPFR_RNDN);
        mpfr_sub(r28300, r28295, r28292, MPFR_RNDN);
        mpfr_mul(r28301, r28292, r28292, MPFR_RNDN);
        mpfr_mul(r28302, r28300, r28301, MPFR_RNDN);
        mpfr_add(r28303, r28299, r28302, MPFR_RNDN);
        mpfr_add(r28304, r28297, r28303, MPFR_RNDN);
        ;
        mpfr_set_si(r28306, mpfr_cmp(r28304, r28305) <= 0, MPFR_RNDN);
        mpfr_div(r28307, r28292, r28296, MPFR_RNDN);
        mpfr_sub(r28308, r28292, r28307, MPFR_RNDN);
        mpfr_mul(r28309, r28292, r28293, MPFR_RNDN);
        mpfr_add(r28310, r28293, r28309, MPFR_RNDN);
        mpfr_div(r28311, r28291, r28310, MPFR_RNDN);
        mpfr_add(r28312, r28308, r28311, MPFR_RNDN);
        if (mpfr_get_si(r28306, MPFR_RNDN)) { mpfr_set(r28313, r28304, MPFR_RNDN); } else { mpfr_set(r28313, r28312, MPFR_RNDN); };
        return mpfr_get_d(r28313, MPFR_RNDN);
}

