#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 r28632 = wj;
        float r28633 = exp(r28632);
        float r28634 = r28632 * r28633;
        float r28635 = x;
        float r28636 = r28634 - r28635;
        float r28637 = r28633 + r28634;
        float r28638 = r28636 / r28637;
        float r28639 = r28632 - r28638;
        return r28639;
}

double f_id(double wj, double x) {
        double r28640 = wj;
        double r28641 = exp(r28640);
        double r28642 = r28640 * r28641;
        double r28643 = x;
        double r28644 = r28642 - r28643;
        double r28645 = r28641 + r28642;
        double r28646 = r28644 / r28645;
        double r28647 = r28640 - r28646;
        return r28647;
}


double f_of(float wj, float x) {
        float r28648 = wj;
        float r28649 = exp(r28648);
        float r28650 = r28648 * r28649;
        float r28651 = x;
        float r28652 = r28650 - r28651;
        float r28653 = r28649 + r28650;
        float r28654 = r28652 / r28653;
        float r28655 = r28648 - r28654;
        float r28656 = 4.510755144047722e-12;
        bool r28657 = r28655 <= r28656;
        float r28658 = r28651 / r28649;
        float r28659 = 1;
        float r28660 = r28659 + r28648;
        float r28661 = r28658 / r28660;
        float r28662 = 4;
        float r28663 = pow(r28648, r28662);
        float r28664 = r28659 - r28648;
        float r28665 = r28648 * r28648;
        float r28666 = r28664 * r28665;
        float r28667 = r28663 + r28666;
        float r28668 = r28661 + r28667;
        float r28669 = r28648 / r28660;
        float r28670 = r28648 - r28669;
        float r28671 = r28651 / r28653;
        float r28672 = r28670 + r28671;
        float r28673 = r28657 ? r28668 : r28672;
        return r28673;
}

double f_od(double wj, double x) {
        double r28674 = wj;
        double r28675 = exp(r28674);
        double r28676 = r28674 * r28675;
        double r28677 = x;
        double r28678 = r28676 - r28677;
        double r28679 = r28675 + r28676;
        double r28680 = r28678 / r28679;
        double r28681 = r28674 - r28680;
        double r28682 = 4.510755144047722e-12;
        bool r28683 = r28681 <= r28682;
        double r28684 = r28677 / r28675;
        double r28685 = 1;
        double r28686 = r28685 + r28674;
        double r28687 = r28684 / r28686;
        double r28688 = 4;
        double r28689 = pow(r28674, r28688);
        double r28690 = r28685 - r28674;
        double r28691 = r28674 * r28674;
        double r28692 = r28690 * r28691;
        double r28693 = r28689 + r28692;
        double r28694 = r28687 + r28693;
        double r28695 = r28674 / r28686;
        double r28696 = r28674 - r28695;
        double r28697 = r28677 / r28679;
        double r28698 = r28696 + r28697;
        double r28699 = r28683 ? r28694 : r28698;
        return r28699;
}

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 r28700, r28701, r28702, r28703, r28704, r28705, r28706, r28707;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(848);
        mpfr_init(r28700);
        mpfr_init(r28701);
        mpfr_init(r28702);
        mpfr_init(r28703);
        mpfr_init(r28704);
        mpfr_init(r28705);
        mpfr_init(r28706);
        mpfr_init(r28707);
}

double f_im(double wj, double x) {
        mpfr_set_d(r28700, wj, MPFR_RNDN);
        mpfr_exp(r28701, r28700, MPFR_RNDN);
        mpfr_mul(r28702, r28700, r28701, MPFR_RNDN);
        mpfr_set_d(r28703, x, MPFR_RNDN);
        mpfr_sub(r28704, r28702, r28703, MPFR_RNDN);
        mpfr_add(r28705, r28701, r28702, MPFR_RNDN);
        mpfr_div(r28706, r28704, r28705, MPFR_RNDN);
        mpfr_sub(r28707, r28700, r28706, MPFR_RNDN);
        return mpfr_get_d(r28707, MPFR_RNDN);
}

static mpfr_t r28708, r28709, r28710, r28711, r28712, r28713, r28714, r28715, r28716, r28717, r28718, r28719, r28720, r28721, r28722, r28723, r28724, r28725, r28726, r28727, r28728, r28729, r28730, r28731, r28732, r28733;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(848);
        mpfr_init(r28708);
        mpfr_init(r28709);
        mpfr_init(r28710);
        mpfr_init(r28711);
        mpfr_init(r28712);
        mpfr_init(r28713);
        mpfr_init(r28714);
        mpfr_init(r28715);
        mpfr_init_set_str(r28716, "4.510755144047722e-12", 10, MPFR_RNDN);
        mpfr_init(r28717);
        mpfr_init(r28718);
        mpfr_init_set_str(r28719, "1", 10, MPFR_RNDN);
        mpfr_init(r28720);
        mpfr_init(r28721);
        mpfr_init_set_str(r28722, "4", 10, MPFR_RNDN);
        mpfr_init(r28723);
        mpfr_init(r28724);
        mpfr_init(r28725);
        mpfr_init(r28726);
        mpfr_init(r28727);
        mpfr_init(r28728);
        mpfr_init(r28729);
        mpfr_init(r28730);
        mpfr_init(r28731);
        mpfr_init(r28732);
        mpfr_init(r28733);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r28708, wj, MPFR_RNDN);
        mpfr_exp(r28709, r28708, MPFR_RNDN);
        mpfr_mul(r28710, r28708, r28709, MPFR_RNDN);
        mpfr_set_d(r28711, x, MPFR_RNDN);
        mpfr_sub(r28712, r28710, r28711, MPFR_RNDN);
        mpfr_add(r28713, r28709, r28710, MPFR_RNDN);
        mpfr_div(r28714, r28712, r28713, MPFR_RNDN);
        mpfr_sub(r28715, r28708, r28714, MPFR_RNDN);
        ;
        mpfr_set_si(r28717, mpfr_cmp(r28715, r28716) <= 0, MPFR_RNDN);
        mpfr_div(r28718, r28711, r28709, MPFR_RNDN);
        ;
        mpfr_add(r28720, r28719, r28708, MPFR_RNDN);
        mpfr_div(r28721, r28718, r28720, MPFR_RNDN);
        ;
        mpfr_pow(r28723, r28708, r28722, MPFR_RNDN);
        mpfr_sub(r28724, r28719, r28708, MPFR_RNDN);
        mpfr_mul(r28725, r28708, r28708, MPFR_RNDN);
        mpfr_mul(r28726, r28724, r28725, MPFR_RNDN);
        mpfr_add(r28727, r28723, r28726, MPFR_RNDN);
        mpfr_add(r28728, r28721, r28727, MPFR_RNDN);
        mpfr_div(r28729, r28708, r28720, MPFR_RNDN);
        mpfr_sub(r28730, r28708, r28729, MPFR_RNDN);
        mpfr_div(r28731, r28711, r28713, MPFR_RNDN);
        mpfr_add(r28732, r28730, r28731, MPFR_RNDN);
        if (mpfr_get_si(r28717, MPFR_RNDN)) { mpfr_set(r28733, r28728, MPFR_RNDN); } else { mpfr_set(r28733, r28732, MPFR_RNDN); };
        return mpfr_get_d(r28733, MPFR_RNDN);
}

static mpfr_t r28734, r28735, r28736, r28737, r28738, r28739, r28740, r28741, r28742, r28743, r28744, r28745, r28746, r28747, r28748, r28749, r28750, r28751, r28752, r28753, r28754, r28755, r28756, r28757, r28758, r28759;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(848);
        mpfr_init(r28734);
        mpfr_init(r28735);
        mpfr_init(r28736);
        mpfr_init(r28737);
        mpfr_init(r28738);
        mpfr_init(r28739);
        mpfr_init(r28740);
        mpfr_init(r28741);
        mpfr_init_set_str(r28742, "4.510755144047722e-12", 10, MPFR_RNDN);
        mpfr_init(r28743);
        mpfr_init(r28744);
        mpfr_init_set_str(r28745, "1", 10, MPFR_RNDN);
        mpfr_init(r28746);
        mpfr_init(r28747);
        mpfr_init_set_str(r28748, "4", 10, MPFR_RNDN);
        mpfr_init(r28749);
        mpfr_init(r28750);
        mpfr_init(r28751);
        mpfr_init(r28752);
        mpfr_init(r28753);
        mpfr_init(r28754);
        mpfr_init(r28755);
        mpfr_init(r28756);
        mpfr_init(r28757);
        mpfr_init(r28758);
        mpfr_init(r28759);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r28734, wj, MPFR_RNDN);
        mpfr_exp(r28735, r28734, MPFR_RNDN);
        mpfr_mul(r28736, r28734, r28735, MPFR_RNDN);
        mpfr_set_d(r28737, x, MPFR_RNDN);
        mpfr_sub(r28738, r28736, r28737, MPFR_RNDN);
        mpfr_add(r28739, r28735, r28736, MPFR_RNDN);
        mpfr_div(r28740, r28738, r28739, MPFR_RNDN);
        mpfr_sub(r28741, r28734, r28740, MPFR_RNDN);
        ;
        mpfr_set_si(r28743, mpfr_cmp(r28741, r28742) <= 0, MPFR_RNDN);
        mpfr_div(r28744, r28737, r28735, MPFR_RNDN);
        ;
        mpfr_add(r28746, r28745, r28734, MPFR_RNDN);
        mpfr_div(r28747, r28744, r28746, MPFR_RNDN);
        ;
        mpfr_pow(r28749, r28734, r28748, MPFR_RNDN);
        mpfr_sub(r28750, r28745, r28734, MPFR_RNDN);
        mpfr_mul(r28751, r28734, r28734, MPFR_RNDN);
        mpfr_mul(r28752, r28750, r28751, MPFR_RNDN);
        mpfr_add(r28753, r28749, r28752, MPFR_RNDN);
        mpfr_add(r28754, r28747, r28753, MPFR_RNDN);
        mpfr_div(r28755, r28734, r28746, MPFR_RNDN);
        mpfr_sub(r28756, r28734, r28755, MPFR_RNDN);
        mpfr_div(r28757, r28737, r28739, MPFR_RNDN);
        mpfr_add(r28758, r28756, r28757, MPFR_RNDN);
        if (mpfr_get_si(r28743, MPFR_RNDN)) { mpfr_set(r28759, r28754, MPFR_RNDN); } else { mpfr_set(r28759, r28758, MPFR_RNDN); };
        return mpfr_get_d(r28759, MPFR_RNDN);
}

