#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 r19847 = wj;
        float r19848 = exp(r19847);
        float r19849 = r19847 * r19848;
        float r19850 = x;
        float r19851 = r19849 - r19850;
        float r19852 = r19848 + r19849;
        float r19853 = r19851 / r19852;
        float r19854 = r19847 - r19853;
        return r19854;
}

double f_id(double wj, double x) {
        double r19855 = wj;
        double r19856 = exp(r19855);
        double r19857 = r19855 * r19856;
        double r19858 = x;
        double r19859 = r19857 - r19858;
        double r19860 = r19856 + r19857;
        double r19861 = r19859 / r19860;
        double r19862 = r19855 - r19861;
        return r19862;
}


double f_of(float wj, float x) {
        float r19863 = wj;
        float r19864 = exp(r19863);
        float r19865 = r19863 * r19864;
        float r19866 = x;
        float r19867 = r19865 - r19866;
        float r19868 = r19864 + r19865;
        float r19869 = r19867 / r19868;
        float r19870 = r19863 - r19869;
        float r19871 = 8.668149997212193e-16f;
        bool r19872 = r19870 <= r19871;
        float r19873 = r19863 * r19863;
        float r19874 = r19873 + r19866;
        float r19875 = 2.0f;
        float r19876 = r19863 * r19866;
        float r19877 = r19875 * r19876;
        float r19878 = r19874 - r19877;
        float r19879 = 1.0f;
        float r19880 = r19879 + r19863;
        float r19881 = r19863 / r19880;
        float r19882 = r19863 - r19881;
        float r19883 = r19866 / r19868;
        float r19884 = r19882 + r19883;
        float r19885 = r19872 ? r19878 : r19884;
        return r19885;
}

double f_od(double wj, double x) {
        double r19886 = wj;
        double r19887 = exp(r19886);
        double r19888 = r19886 * r19887;
        double r19889 = x;
        double r19890 = r19888 - r19889;
        double r19891 = r19887 + r19888;
        double r19892 = r19890 / r19891;
        double r19893 = r19886 - r19892;
        double r19894 = 8.668149997212193e-16;
        bool r19895 = r19893 <= r19894;
        double r19896 = r19886 * r19886;
        double r19897 = r19896 + r19889;
        double r19898 = 2.0;
        double r19899 = r19886 * r19889;
        double r19900 = r19898 * r19899;
        double r19901 = r19897 - r19900;
        double r19902 = 1.0;
        double r19903 = r19902 + r19886;
        double r19904 = r19886 / r19903;
        double r19905 = r19886 - r19904;
        double r19906 = r19889 / r19891;
        double r19907 = r19905 + r19906;
        double r19908 = r19895 ? r19901 : r19907;
        return r19908;
}

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 r19909, r19910, r19911, r19912, r19913, r19914, r19915, r19916;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r19909);
        mpfr_init(r19910);
        mpfr_init(r19911);
        mpfr_init(r19912);
        mpfr_init(r19913);
        mpfr_init(r19914);
        mpfr_init(r19915);
        mpfr_init(r19916);
}

double f_im(double wj, double x) {
        mpfr_set_d(r19909, wj, MPFR_RNDN);
        mpfr_exp(r19910, r19909, MPFR_RNDN);
        mpfr_mul(r19911, r19909, r19910, MPFR_RNDN);
        mpfr_set_d(r19912, x, MPFR_RNDN);
        mpfr_sub(r19913, r19911, r19912, MPFR_RNDN);
        mpfr_add(r19914, r19910, r19911, MPFR_RNDN);
        mpfr_div(r19915, r19913, r19914, MPFR_RNDN);
        mpfr_sub(r19916, r19909, r19915, MPFR_RNDN);
        return mpfr_get_d(r19916, MPFR_RNDN);
}

static mpfr_t r19917, r19918, r19919, r19920, r19921, r19922, r19923, r19924, r19925, r19926, r19927, r19928, r19929, r19930, r19931, r19932, r19933, r19934, r19935, r19936, r19937, r19938, r19939;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r19917);
        mpfr_init(r19918);
        mpfr_init(r19919);
        mpfr_init(r19920);
        mpfr_init(r19921);
        mpfr_init(r19922);
        mpfr_init(r19923);
        mpfr_init(r19924);
        mpfr_init_set_str(r19925, "8.668149997212193e-16", 10, MPFR_RNDN);
        mpfr_init(r19926);
        mpfr_init(r19927);
        mpfr_init(r19928);
        mpfr_init_set_str(r19929, "2", 10, MPFR_RNDN);
        mpfr_init(r19930);
        mpfr_init(r19931);
        mpfr_init(r19932);
        mpfr_init_set_str(r19933, "1", 10, MPFR_RNDN);
        mpfr_init(r19934);
        mpfr_init(r19935);
        mpfr_init(r19936);
        mpfr_init(r19937);
        mpfr_init(r19938);
        mpfr_init(r19939);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r19917, wj, MPFR_RNDN);
        mpfr_exp(r19918, r19917, MPFR_RNDN);
        mpfr_mul(r19919, r19917, r19918, MPFR_RNDN);
        mpfr_set_d(r19920, x, MPFR_RNDN);
        mpfr_sub(r19921, r19919, r19920, MPFR_RNDN);
        mpfr_add(r19922, r19918, r19919, MPFR_RNDN);
        mpfr_div(r19923, r19921, r19922, MPFR_RNDN);
        mpfr_sub(r19924, r19917, r19923, MPFR_RNDN);
        ;
        mpfr_set_si(r19926, mpfr_cmp(r19924, r19925) <= 0, MPFR_RNDN);
        mpfr_sqr(r19927, r19917, MPFR_RNDN);
        mpfr_add(r19928, r19927, r19920, MPFR_RNDN);
        ;
        mpfr_mul(r19930, r19917, r19920, MPFR_RNDN);
        mpfr_mul(r19931, r19929, r19930, MPFR_RNDN);
        mpfr_sub(r19932, r19928, r19931, MPFR_RNDN);
        ;
        mpfr_add(r19934, r19933, r19917, MPFR_RNDN);
        mpfr_div(r19935, r19917, r19934, MPFR_RNDN);
        mpfr_sub(r19936, r19917, r19935, MPFR_RNDN);
        mpfr_div(r19937, r19920, r19922, MPFR_RNDN);
        mpfr_add(r19938, r19936, r19937, MPFR_RNDN);
        if (mpfr_get_si(r19926, MPFR_RNDN)) { mpfr_set(r19939, r19932, MPFR_RNDN); } else { mpfr_set(r19939, r19938, MPFR_RNDN); };
        return mpfr_get_d(r19939, MPFR_RNDN);
}

static mpfr_t r19940, r19941, r19942, r19943, r19944, r19945, r19946, r19947, r19948, r19949, r19950, r19951, r19952, r19953, r19954, r19955, r19956, r19957, r19958, r19959, r19960, r19961, r19962;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r19940);
        mpfr_init(r19941);
        mpfr_init(r19942);
        mpfr_init(r19943);
        mpfr_init(r19944);
        mpfr_init(r19945);
        mpfr_init(r19946);
        mpfr_init(r19947);
        mpfr_init_set_str(r19948, "8.668149997212193e-16", 10, MPFR_RNDN);
        mpfr_init(r19949);
        mpfr_init(r19950);
        mpfr_init(r19951);
        mpfr_init_set_str(r19952, "2", 10, MPFR_RNDN);
        mpfr_init(r19953);
        mpfr_init(r19954);
        mpfr_init(r19955);
        mpfr_init_set_str(r19956, "1", 10, MPFR_RNDN);
        mpfr_init(r19957);
        mpfr_init(r19958);
        mpfr_init(r19959);
        mpfr_init(r19960);
        mpfr_init(r19961);
        mpfr_init(r19962);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r19940, wj, MPFR_RNDN);
        mpfr_exp(r19941, r19940, MPFR_RNDN);
        mpfr_mul(r19942, r19940, r19941, MPFR_RNDN);
        mpfr_set_d(r19943, x, MPFR_RNDN);
        mpfr_sub(r19944, r19942, r19943, MPFR_RNDN);
        mpfr_add(r19945, r19941, r19942, MPFR_RNDN);
        mpfr_div(r19946, r19944, r19945, MPFR_RNDN);
        mpfr_sub(r19947, r19940, r19946, MPFR_RNDN);
        ;
        mpfr_set_si(r19949, mpfr_cmp(r19947, r19948) <= 0, MPFR_RNDN);
        mpfr_sqr(r19950, r19940, MPFR_RNDN);
        mpfr_add(r19951, r19950, r19943, MPFR_RNDN);
        ;
        mpfr_mul(r19953, r19940, r19943, MPFR_RNDN);
        mpfr_mul(r19954, r19952, r19953, MPFR_RNDN);
        mpfr_sub(r19955, r19951, r19954, MPFR_RNDN);
        ;
        mpfr_add(r19957, r19956, r19940, MPFR_RNDN);
        mpfr_div(r19958, r19940, r19957, MPFR_RNDN);
        mpfr_sub(r19959, r19940, r19958, MPFR_RNDN);
        mpfr_div(r19960, r19943, r19945, MPFR_RNDN);
        mpfr_add(r19961, r19959, r19960, MPFR_RNDN);
        if (mpfr_get_si(r19949, MPFR_RNDN)) { mpfr_set(r19962, r19955, MPFR_RNDN); } else { mpfr_set(r19962, r19961, MPFR_RNDN); };
        return mpfr_get_d(r19962, MPFR_RNDN);
}

