#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 r33184 = R;
        float r33185 = lambda1;
        float r33186 = lambda2;
        float r33187 = r33185 - r33186;
        float r33188 = phi1;
        float r33189 = phi2;
        float r33190 = r33188 + r33189;
        float r33191 = 2;
        float r33192 = r33190 / r33191;
        float r33193 = cos(r33192);
        float r33194 = r33187 * r33193;
        float r33195 = r33194 * r33194;
        float r33196 = r33188 - r33189;
        float r33197 = r33196 * r33196;
        float r33198 = r33195 + r33197;
        float r33199 = sqrt(r33198);
        float r33200 = r33184 * r33199;
        return r33200;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33201 = R;
        double r33202 = lambda1;
        double r33203 = lambda2;
        double r33204 = r33202 - r33203;
        double r33205 = phi1;
        double r33206 = phi2;
        double r33207 = r33205 + r33206;
        double r33208 = 2;
        double r33209 = r33207 / r33208;
        double r33210 = cos(r33209);
        double r33211 = r33204 * r33210;
        double r33212 = r33211 * r33211;
        double r33213 = r33205 - r33206;
        double r33214 = r33213 * r33213;
        double r33215 = r33212 + r33214;
        double r33216 = sqrt(r33215);
        double r33217 = r33201 * r33216;
        return r33217;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r33218 = phi2;
        float r33219 = 2.8760683199294135e+153;
        bool r33220 = r33218 <= r33219;
        float r33221 = R;
        float r33222 = lambda1;
        float r33223 = lambda2;
        float r33224 = r33222 - r33223;
        float r33225 = phi1;
        float r33226 = r33225 + r33218;
        float r33227 = 2;
        float r33228 = r33226 / r33227;
        float r33229 = cos(r33228);
        float r33230 = r33224 * r33229;
        float r33231 = exp(r33229);
        float r33232 = log(r33231);
        float r33233 = r33224 * r33232;
        float r33234 = r33230 * r33233;
        float r33235 = r33225 - r33218;
        float r33236 = r33235 * r33235;
        float r33237 = r33234 + r33236;
        float r33238 = sqrt(r33237);
        float r33239 = r33221 * r33238;
        float r33240 = r33218 - r33225;
        float r33241 = r33221 * r33240;
        float r33242 = r33220 ? r33239 : r33241;
        return r33242;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33243 = phi2;
        double r33244 = 2.8760683199294135e+153;
        bool r33245 = r33243 <= r33244;
        double r33246 = R;
        double r33247 = lambda1;
        double r33248 = lambda2;
        double r33249 = r33247 - r33248;
        double r33250 = phi1;
        double r33251 = r33250 + r33243;
        double r33252 = 2;
        double r33253 = r33251 / r33252;
        double r33254 = cos(r33253);
        double r33255 = r33249 * r33254;
        double r33256 = exp(r33254);
        double r33257 = log(r33256);
        double r33258 = r33249 * r33257;
        double r33259 = r33255 * r33258;
        double r33260 = r33250 - r33243;
        double r33261 = r33260 * r33260;
        double r33262 = r33259 + r33261;
        double r33263 = sqrt(r33262);
        double r33264 = r33246 * r33263;
        double r33265 = r33243 - r33250;
        double r33266 = r33246 * r33265;
        double r33267 = r33245 ? r33264 : r33266;
        return r33267;
}

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 r33268, r33269, r33270, r33271, r33272, r33273, r33274, r33275, r33276, r33277, r33278, r33279, r33280, r33281, r33282, r33283, r33284;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33268);
        mpfr_init(r33269);
        mpfr_init(r33270);
        mpfr_init(r33271);
        mpfr_init(r33272);
        mpfr_init(r33273);
        mpfr_init(r33274);
        mpfr_init_set_str(r33275, "2", 10, MPFR_RNDN);
        mpfr_init(r33276);
        mpfr_init(r33277);
        mpfr_init(r33278);
        mpfr_init(r33279);
        mpfr_init(r33280);
        mpfr_init(r33281);
        mpfr_init(r33282);
        mpfr_init(r33283);
        mpfr_init(r33284);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33268, R, MPFR_RNDN);
        mpfr_set_d(r33269, lambda1, MPFR_RNDN);
        mpfr_set_d(r33270, lambda2, MPFR_RNDN);
        mpfr_sub(r33271, r33269, r33270, MPFR_RNDN);
        mpfr_set_d(r33272, phi1, MPFR_RNDN);
        mpfr_set_d(r33273, phi2, MPFR_RNDN);
        mpfr_add(r33274, r33272, r33273, MPFR_RNDN);
        ;
        mpfr_div(r33276, r33274, r33275, MPFR_RNDN);
        mpfr_cos(r33277, r33276, MPFR_RNDN);
        mpfr_mul(r33278, r33271, r33277, MPFR_RNDN);
        mpfr_mul(r33279, r33278, r33278, MPFR_RNDN);
        mpfr_sub(r33280, r33272, r33273, MPFR_RNDN);
        mpfr_mul(r33281, r33280, r33280, MPFR_RNDN);
        mpfr_add(r33282, r33279, r33281, MPFR_RNDN);
        mpfr_sqrt(r33283, r33282, MPFR_RNDN);
        mpfr_mul(r33284, r33268, r33283, MPFR_RNDN);
        return mpfr_get_d(r33284, MPFR_RNDN);
}

static mpfr_t r33285, r33286, r33287, r33288, r33289, r33290, r33291, r33292, r33293, r33294, r33295, r33296, r33297, r33298, r33299, r33300, r33301, r33302, r33303, r33304, r33305, r33306, r33307, r33308, r33309;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33285);
        mpfr_init_set_str(r33286, "2.8760683199294135e+153", 10, MPFR_RNDN);
        mpfr_init(r33287);
        mpfr_init(r33288);
        mpfr_init(r33289);
        mpfr_init(r33290);
        mpfr_init(r33291);
        mpfr_init(r33292);
        mpfr_init(r33293);
        mpfr_init_set_str(r33294, "2", 10, MPFR_RNDN);
        mpfr_init(r33295);
        mpfr_init(r33296);
        mpfr_init(r33297);
        mpfr_init(r33298);
        mpfr_init(r33299);
        mpfr_init(r33300);
        mpfr_init(r33301);
        mpfr_init(r33302);
        mpfr_init(r33303);
        mpfr_init(r33304);
        mpfr_init(r33305);
        mpfr_init(r33306);
        mpfr_init(r33307);
        mpfr_init(r33308);
        mpfr_init(r33309);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33285, phi2, MPFR_RNDN);
        ;
        mpfr_set_si(r33287, mpfr_cmp(r33285, r33286) <= 0, MPFR_RNDN);
        mpfr_set_d(r33288, R, MPFR_RNDN);
        mpfr_set_d(r33289, lambda1, MPFR_RNDN);
        mpfr_set_d(r33290, lambda2, MPFR_RNDN);
        mpfr_sub(r33291, r33289, r33290, MPFR_RNDN);
        mpfr_set_d(r33292, phi1, MPFR_RNDN);
        mpfr_add(r33293, r33292, r33285, MPFR_RNDN);
        ;
        mpfr_div(r33295, r33293, r33294, MPFR_RNDN);
        mpfr_cos(r33296, r33295, MPFR_RNDN);
        mpfr_mul(r33297, r33291, r33296, MPFR_RNDN);
        mpfr_exp(r33298, r33296, MPFR_RNDN);
        mpfr_log(r33299, r33298, MPFR_RNDN);
        mpfr_mul(r33300, r33291, r33299, MPFR_RNDN);
        mpfr_mul(r33301, r33297, r33300, MPFR_RNDN);
        mpfr_sub(r33302, r33292, r33285, MPFR_RNDN);
        mpfr_mul(r33303, r33302, r33302, MPFR_RNDN);
        mpfr_add(r33304, r33301, r33303, MPFR_RNDN);
        mpfr_sqrt(r33305, r33304, MPFR_RNDN);
        mpfr_mul(r33306, r33288, r33305, MPFR_RNDN);
        mpfr_sub(r33307, r33285, r33292, MPFR_RNDN);
        mpfr_mul(r33308, r33288, r33307, MPFR_RNDN);
        if (mpfr_get_si(r33287, MPFR_RNDN)) { mpfr_set(r33309, r33306, MPFR_RNDN); } else { mpfr_set(r33309, r33308, MPFR_RNDN); };
        return mpfr_get_d(r33309, MPFR_RNDN);
}

static mpfr_t r33310, r33311, r33312, r33313, r33314, r33315, r33316, r33317, r33318, r33319, r33320, r33321, r33322, r33323, r33324, r33325, r33326, r33327, r33328, r33329, r33330, r33331, r33332, r33333, r33334;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33310);
        mpfr_init_set_str(r33311, "2.8760683199294135e+153", 10, MPFR_RNDN);
        mpfr_init(r33312);
        mpfr_init(r33313);
        mpfr_init(r33314);
        mpfr_init(r33315);
        mpfr_init(r33316);
        mpfr_init(r33317);
        mpfr_init(r33318);
        mpfr_init_set_str(r33319, "2", 10, MPFR_RNDN);
        mpfr_init(r33320);
        mpfr_init(r33321);
        mpfr_init(r33322);
        mpfr_init(r33323);
        mpfr_init(r33324);
        mpfr_init(r33325);
        mpfr_init(r33326);
        mpfr_init(r33327);
        mpfr_init(r33328);
        mpfr_init(r33329);
        mpfr_init(r33330);
        mpfr_init(r33331);
        mpfr_init(r33332);
        mpfr_init(r33333);
        mpfr_init(r33334);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33310, phi2, MPFR_RNDN);
        ;
        mpfr_set_si(r33312, mpfr_cmp(r33310, r33311) <= 0, MPFR_RNDN);
        mpfr_set_d(r33313, R, MPFR_RNDN);
        mpfr_set_d(r33314, lambda1, MPFR_RNDN);
        mpfr_set_d(r33315, lambda2, MPFR_RNDN);
        mpfr_sub(r33316, r33314, r33315, MPFR_RNDN);
        mpfr_set_d(r33317, phi1, MPFR_RNDN);
        mpfr_add(r33318, r33317, r33310, MPFR_RNDN);
        ;
        mpfr_div(r33320, r33318, r33319, MPFR_RNDN);
        mpfr_cos(r33321, r33320, MPFR_RNDN);
        mpfr_mul(r33322, r33316, r33321, MPFR_RNDN);
        mpfr_exp(r33323, r33321, MPFR_RNDN);
        mpfr_log(r33324, r33323, MPFR_RNDN);
        mpfr_mul(r33325, r33316, r33324, MPFR_RNDN);
        mpfr_mul(r33326, r33322, r33325, MPFR_RNDN);
        mpfr_sub(r33327, r33317, r33310, MPFR_RNDN);
        mpfr_mul(r33328, r33327, r33327, MPFR_RNDN);
        mpfr_add(r33329, r33326, r33328, MPFR_RNDN);
        mpfr_sqrt(r33330, r33329, MPFR_RNDN);
        mpfr_mul(r33331, r33313, r33330, MPFR_RNDN);
        mpfr_sub(r33332, r33310, r33317, MPFR_RNDN);
        mpfr_mul(r33333, r33313, r33332, MPFR_RNDN);
        if (mpfr_get_si(r33312, MPFR_RNDN)) { mpfr_set(r33334, r33331, MPFR_RNDN); } else { mpfr_set(r33334, r33333, MPFR_RNDN); };
        return mpfr_get_d(r33334, MPFR_RNDN);
}

