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

char *name = "Equirectangular approximation to distance on a great circle";

double f_if(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r33177 = R;
        float r33178 = lambda1;
        float r33179 = lambda2;
        float r33180 = r33178 - r33179;
        float r33181 = phi1;
        float r33182 = phi2;
        float r33183 = r33181 + r33182;
        float r33184 = 2;
        float r33185 = r33183 / r33184;
        float r33186 = cos(r33185);
        float r33187 = r33180 * r33186;
        float r33188 = r33187 * r33187;
        float r33189 = r33181 - r33182;
        float r33190 = r33189 * r33189;
        float r33191 = r33188 + r33190;
        float r33192 = sqrt(r33191);
        float r33193 = r33177 * r33192;
        return r33193;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33194 = R;
        double r33195 = lambda1;
        double r33196 = lambda2;
        double r33197 = r33195 - r33196;
        double r33198 = phi1;
        double r33199 = phi2;
        double r33200 = r33198 + r33199;
        double r33201 = 2;
        double r33202 = r33200 / r33201;
        double r33203 = cos(r33202);
        double r33204 = r33197 * r33203;
        double r33205 = r33204 * r33204;
        double r33206 = r33198 - r33199;
        double r33207 = r33206 * r33206;
        double r33208 = r33205 + r33207;
        double r33209 = sqrt(r33208);
        double r33210 = r33194 * r33209;
        return r33210;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r33211 = phi2;
        float r33212 = 2.8760683199294135e+153;
        bool r33213 = r33211 <= r33212;
        float r33214 = R;
        float r33215 = lambda1;
        float r33216 = lambda2;
        float r33217 = r33215 - r33216;
        float r33218 = phi1;
        float r33219 = r33218 + r33211;
        float r33220 = 2;
        float r33221 = r33219 / r33220;
        float r33222 = cos(r33221);
        float r33223 = r33217 * r33222;
        float r33224 = exp(r33222);
        float r33225 = log(r33224);
        float r33226 = r33217 * r33225;
        float r33227 = r33223 * r33226;
        float r33228 = r33218 - r33211;
        float r33229 = r33228 * r33228;
        float r33230 = r33227 + r33229;
        float r33231 = sqrt(r33230);
        float r33232 = r33214 * r33231;
        float r33233 = r33211 - r33218;
        float r33234 = r33214 * r33233;
        float r33235 = r33213 ? r33232 : r33234;
        return r33235;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33236 = phi2;
        double r33237 = 2.8760683199294135e+153;
        bool r33238 = r33236 <= r33237;
        double r33239 = R;
        double r33240 = lambda1;
        double r33241 = lambda2;
        double r33242 = r33240 - r33241;
        double r33243 = phi1;
        double r33244 = r33243 + r33236;
        double r33245 = 2;
        double r33246 = r33244 / r33245;
        double r33247 = cos(r33246);
        double r33248 = r33242 * r33247;
        double r33249 = exp(r33247);
        double r33250 = log(r33249);
        double r33251 = r33242 * r33250;
        double r33252 = r33248 * r33251;
        double r33253 = r33243 - r33236;
        double r33254 = r33253 * r33253;
        double r33255 = r33252 + r33254;
        double r33256 = sqrt(r33255);
        double r33257 = r33239 * r33256;
        double r33258 = r33236 - r33243;
        double r33259 = r33239 * r33258;
        double r33260 = r33238 ? r33257 : r33259;
        return r33260;
}

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 r33261, r33262, r33263, r33264, r33265, r33266, r33267, r33268, r33269, r33270, r33271, r33272, r33273, r33274, r33275, r33276, r33277;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33261);
        mpfr_init(r33262);
        mpfr_init(r33263);
        mpfr_init(r33264);
        mpfr_init(r33265);
        mpfr_init(r33266);
        mpfr_init(r33267);
        mpfr_init_set_str(r33268, "2", 10, MPFR_RNDN);
        mpfr_init(r33269);
        mpfr_init(r33270);
        mpfr_init(r33271);
        mpfr_init(r33272);
        mpfr_init(r33273);
        mpfr_init(r33274);
        mpfr_init(r33275);
        mpfr_init(r33276);
        mpfr_init(r33277);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33261, R, MPFR_RNDN);
        mpfr_set_d(r33262, lambda1, MPFR_RNDN);
        mpfr_set_d(r33263, lambda2, MPFR_RNDN);
        mpfr_sub(r33264, r33262, r33263, MPFR_RNDN);
        mpfr_set_d(r33265, phi1, MPFR_RNDN);
        mpfr_set_d(r33266, phi2, MPFR_RNDN);
        mpfr_add(r33267, r33265, r33266, MPFR_RNDN);
        ;
        mpfr_div(r33269, r33267, r33268, MPFR_RNDN);
        mpfr_cos(r33270, r33269, MPFR_RNDN);
        mpfr_mul(r33271, r33264, r33270, MPFR_RNDN);
        mpfr_mul(r33272, r33271, r33271, MPFR_RNDN);
        mpfr_sub(r33273, r33265, r33266, MPFR_RNDN);
        mpfr_mul(r33274, r33273, r33273, MPFR_RNDN);
        mpfr_add(r33275, r33272, r33274, MPFR_RNDN);
        mpfr_sqrt(r33276, r33275, MPFR_RNDN);
        mpfr_mul(r33277, r33261, r33276, MPFR_RNDN);
        return mpfr_get_d(r33277, MPFR_RNDN);
}

static mpfr_t r33278, r33279, r33280, r33281, r33282, r33283, r33284, r33285, r33286, r33287, r33288, r33289, r33290, r33291, r33292, r33293, r33294, r33295, r33296, r33297, r33298, r33299, r33300, r33301, r33302;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33278);
        mpfr_init_set_str(r33279, "2.8760683199294135e+153", 10, MPFR_RNDN);
        mpfr_init(r33280);
        mpfr_init(r33281);
        mpfr_init(r33282);
        mpfr_init(r33283);
        mpfr_init(r33284);
        mpfr_init(r33285);
        mpfr_init(r33286);
        mpfr_init_set_str(r33287, "2", 10, MPFR_RNDN);
        mpfr_init(r33288);
        mpfr_init(r33289);
        mpfr_init(r33290);
        mpfr_init(r33291);
        mpfr_init(r33292);
        mpfr_init(r33293);
        mpfr_init(r33294);
        mpfr_init(r33295);
        mpfr_init(r33296);
        mpfr_init(r33297);
        mpfr_init(r33298);
        mpfr_init(r33299);
        mpfr_init(r33300);
        mpfr_init(r33301);
        mpfr_init(r33302);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33278, phi2, MPFR_RNDN);
        ;
        mpfr_set_si(r33280, mpfr_cmp(r33278, r33279) <= 0, MPFR_RNDN);
        mpfr_set_d(r33281, R, MPFR_RNDN);
        mpfr_set_d(r33282, lambda1, MPFR_RNDN);
        mpfr_set_d(r33283, lambda2, MPFR_RNDN);
        mpfr_sub(r33284, r33282, r33283, MPFR_RNDN);
        mpfr_set_d(r33285, phi1, MPFR_RNDN);
        mpfr_add(r33286, r33285, r33278, MPFR_RNDN);
        ;
        mpfr_div(r33288, r33286, r33287, MPFR_RNDN);
        mpfr_cos(r33289, r33288, MPFR_RNDN);
        mpfr_mul(r33290, r33284, r33289, MPFR_RNDN);
        mpfr_exp(r33291, r33289, MPFR_RNDN);
        mpfr_log(r33292, r33291, MPFR_RNDN);
        mpfr_mul(r33293, r33284, r33292, MPFR_RNDN);
        mpfr_mul(r33294, r33290, r33293, MPFR_RNDN);
        mpfr_sub(r33295, r33285, r33278, MPFR_RNDN);
        mpfr_mul(r33296, r33295, r33295, MPFR_RNDN);
        mpfr_add(r33297, r33294, r33296, MPFR_RNDN);
        mpfr_sqrt(r33298, r33297, MPFR_RNDN);
        mpfr_mul(r33299, r33281, r33298, MPFR_RNDN);
        mpfr_sub(r33300, r33278, r33285, MPFR_RNDN);
        mpfr_mul(r33301, r33281, r33300, MPFR_RNDN);
        if (mpfr_get_si(r33280, MPFR_RNDN)) { mpfr_set(r33302, r33299, MPFR_RNDN); } else { mpfr_set(r33302, r33301, MPFR_RNDN); };
        return mpfr_get_d(r33302, MPFR_RNDN);
}

static mpfr_t r33303, r33304, r33305, r33306, r33307, r33308, r33309, r33310, r33311, r33312, r33313, r33314, r33315, r33316, r33317, r33318, r33319, r33320, r33321, r33322, r33323, r33324, r33325, r33326, r33327;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33303);
        mpfr_init_set_str(r33304, "2.8760683199294135e+153", 10, MPFR_RNDN);
        mpfr_init(r33305);
        mpfr_init(r33306);
        mpfr_init(r33307);
        mpfr_init(r33308);
        mpfr_init(r33309);
        mpfr_init(r33310);
        mpfr_init(r33311);
        mpfr_init_set_str(r33312, "2", 10, MPFR_RNDN);
        mpfr_init(r33313);
        mpfr_init(r33314);
        mpfr_init(r33315);
        mpfr_init(r33316);
        mpfr_init(r33317);
        mpfr_init(r33318);
        mpfr_init(r33319);
        mpfr_init(r33320);
        mpfr_init(r33321);
        mpfr_init(r33322);
        mpfr_init(r33323);
        mpfr_init(r33324);
        mpfr_init(r33325);
        mpfr_init(r33326);
        mpfr_init(r33327);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33303, phi2, MPFR_RNDN);
        ;
        mpfr_set_si(r33305, mpfr_cmp(r33303, r33304) <= 0, MPFR_RNDN);
        mpfr_set_d(r33306, R, MPFR_RNDN);
        mpfr_set_d(r33307, lambda1, MPFR_RNDN);
        mpfr_set_d(r33308, lambda2, MPFR_RNDN);
        mpfr_sub(r33309, r33307, r33308, MPFR_RNDN);
        mpfr_set_d(r33310, phi1, MPFR_RNDN);
        mpfr_add(r33311, r33310, r33303, MPFR_RNDN);
        ;
        mpfr_div(r33313, r33311, r33312, MPFR_RNDN);
        mpfr_cos(r33314, r33313, MPFR_RNDN);
        mpfr_mul(r33315, r33309, r33314, MPFR_RNDN);
        mpfr_exp(r33316, r33314, MPFR_RNDN);
        mpfr_log(r33317, r33316, MPFR_RNDN);
        mpfr_mul(r33318, r33309, r33317, MPFR_RNDN);
        mpfr_mul(r33319, r33315, r33318, MPFR_RNDN);
        mpfr_sub(r33320, r33310, r33303, MPFR_RNDN);
        mpfr_mul(r33321, r33320, r33320, MPFR_RNDN);
        mpfr_add(r33322, r33319, r33321, MPFR_RNDN);
        mpfr_sqrt(r33323, r33322, MPFR_RNDN);
        mpfr_mul(r33324, r33306, r33323, MPFR_RNDN);
        mpfr_sub(r33325, r33303, r33310, MPFR_RNDN);
        mpfr_mul(r33326, r33306, r33325, MPFR_RNDN);
        if (mpfr_get_si(r33305, MPFR_RNDN)) { mpfr_set(r33327, r33324, MPFR_RNDN); } else { mpfr_set(r33327, r33326, MPFR_RNDN); };
        return mpfr_get_d(r33327, MPFR_RNDN);
}

