#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 r33429 = R;
        float r33430 = lambda1;
        float r33431 = lambda2;
        float r33432 = r33430 - r33431;
        float r33433 = phi1;
        float r33434 = phi2;
        float r33435 = r33433 + r33434;
        float r33436 = 2;
        float r33437 = r33435 / r33436;
        float r33438 = cos(r33437);
        float r33439 = r33432 * r33438;
        float r33440 = r33439 * r33439;
        float r33441 = r33433 - r33434;
        float r33442 = r33441 * r33441;
        float r33443 = r33440 + r33442;
        float r33444 = sqrt(r33443);
        float r33445 = r33429 * r33444;
        return r33445;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33446 = R;
        double r33447 = lambda1;
        double r33448 = lambda2;
        double r33449 = r33447 - r33448;
        double r33450 = phi1;
        double r33451 = phi2;
        double r33452 = r33450 + r33451;
        double r33453 = 2;
        double r33454 = r33452 / r33453;
        double r33455 = cos(r33454);
        double r33456 = r33449 * r33455;
        double r33457 = r33456 * r33456;
        double r33458 = r33450 - r33451;
        double r33459 = r33458 * r33458;
        double r33460 = r33457 + r33459;
        double r33461 = sqrt(r33460);
        double r33462 = r33446 * r33461;
        return r33462;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r33463 = phi2;
        float r33464 = 2.8760683199294135e+153;
        bool r33465 = r33463 <= r33464;
        float r33466 = R;
        float r33467 = lambda1;
        float r33468 = lambda2;
        float r33469 = r33467 - r33468;
        float r33470 = phi1;
        float r33471 = r33470 + r33463;
        float r33472 = 2;
        float r33473 = r33471 / r33472;
        float r33474 = cos(r33473);
        float r33475 = r33469 * r33474;
        float r33476 = exp(r33474);
        float r33477 = log(r33476);
        float r33478 = r33469 * r33477;
        float r33479 = r33475 * r33478;
        float r33480 = r33470 - r33463;
        float r33481 = r33480 * r33480;
        float r33482 = r33479 + r33481;
        float r33483 = sqrt(r33482);
        float r33484 = r33466 * r33483;
        float r33485 = r33463 - r33470;
        float r33486 = r33466 * r33485;
        float r33487 = r33465 ? r33484 : r33486;
        return r33487;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33488 = phi2;
        double r33489 = 2.8760683199294135e+153;
        bool r33490 = r33488 <= r33489;
        double r33491 = R;
        double r33492 = lambda1;
        double r33493 = lambda2;
        double r33494 = r33492 - r33493;
        double r33495 = phi1;
        double r33496 = r33495 + r33488;
        double r33497 = 2;
        double r33498 = r33496 / r33497;
        double r33499 = cos(r33498);
        double r33500 = r33494 * r33499;
        double r33501 = exp(r33499);
        double r33502 = log(r33501);
        double r33503 = r33494 * r33502;
        double r33504 = r33500 * r33503;
        double r33505 = r33495 - r33488;
        double r33506 = r33505 * r33505;
        double r33507 = r33504 + r33506;
        double r33508 = sqrt(r33507);
        double r33509 = r33491 * r33508;
        double r33510 = r33488 - r33495;
        double r33511 = r33491 * r33510;
        double r33512 = r33490 ? r33509 : r33511;
        return r33512;
}

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 r33513, r33514, r33515, r33516, r33517, r33518, r33519, r33520, r33521, r33522, r33523, r33524, r33525, r33526, r33527, r33528, r33529;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33513);
        mpfr_init(r33514);
        mpfr_init(r33515);
        mpfr_init(r33516);
        mpfr_init(r33517);
        mpfr_init(r33518);
        mpfr_init(r33519);
        mpfr_init_set_str(r33520, "2", 10, MPFR_RNDN);
        mpfr_init(r33521);
        mpfr_init(r33522);
        mpfr_init(r33523);
        mpfr_init(r33524);
        mpfr_init(r33525);
        mpfr_init(r33526);
        mpfr_init(r33527);
        mpfr_init(r33528);
        mpfr_init(r33529);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33513, R, MPFR_RNDN);
        mpfr_set_d(r33514, lambda1, MPFR_RNDN);
        mpfr_set_d(r33515, lambda2, MPFR_RNDN);
        mpfr_sub(r33516, r33514, r33515, MPFR_RNDN);
        mpfr_set_d(r33517, phi1, MPFR_RNDN);
        mpfr_set_d(r33518, phi2, MPFR_RNDN);
        mpfr_add(r33519, r33517, r33518, MPFR_RNDN);
        ;
        mpfr_div(r33521, r33519, r33520, MPFR_RNDN);
        mpfr_cos(r33522, r33521, MPFR_RNDN);
        mpfr_mul(r33523, r33516, r33522, MPFR_RNDN);
        mpfr_mul(r33524, r33523, r33523, MPFR_RNDN);
        mpfr_sub(r33525, r33517, r33518, MPFR_RNDN);
        mpfr_mul(r33526, r33525, r33525, MPFR_RNDN);
        mpfr_add(r33527, r33524, r33526, MPFR_RNDN);
        mpfr_sqrt(r33528, r33527, MPFR_RNDN);
        mpfr_mul(r33529, r33513, r33528, MPFR_RNDN);
        return mpfr_get_d(r33529, MPFR_RNDN);
}

static mpfr_t r33530, r33531, r33532, r33533, r33534, r33535, r33536, r33537, r33538, r33539, r33540, r33541, r33542, r33543, r33544, r33545, r33546, r33547, r33548, r33549, r33550, r33551, r33552, r33553, r33554;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33530);
        mpfr_init_set_str(r33531, "2.8760683199294135e+153", 10, MPFR_RNDN);
        mpfr_init(r33532);
        mpfr_init(r33533);
        mpfr_init(r33534);
        mpfr_init(r33535);
        mpfr_init(r33536);
        mpfr_init(r33537);
        mpfr_init(r33538);
        mpfr_init_set_str(r33539, "2", 10, MPFR_RNDN);
        mpfr_init(r33540);
        mpfr_init(r33541);
        mpfr_init(r33542);
        mpfr_init(r33543);
        mpfr_init(r33544);
        mpfr_init(r33545);
        mpfr_init(r33546);
        mpfr_init(r33547);
        mpfr_init(r33548);
        mpfr_init(r33549);
        mpfr_init(r33550);
        mpfr_init(r33551);
        mpfr_init(r33552);
        mpfr_init(r33553);
        mpfr_init(r33554);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33530, phi2, MPFR_RNDN);
        ;
        mpfr_set_si(r33532, mpfr_cmp(r33530, r33531) <= 0, MPFR_RNDN);
        mpfr_set_d(r33533, R, MPFR_RNDN);
        mpfr_set_d(r33534, lambda1, MPFR_RNDN);
        mpfr_set_d(r33535, lambda2, MPFR_RNDN);
        mpfr_sub(r33536, r33534, r33535, MPFR_RNDN);
        mpfr_set_d(r33537, phi1, MPFR_RNDN);
        mpfr_add(r33538, r33537, r33530, MPFR_RNDN);
        ;
        mpfr_div(r33540, r33538, r33539, MPFR_RNDN);
        mpfr_cos(r33541, r33540, MPFR_RNDN);
        mpfr_mul(r33542, r33536, r33541, MPFR_RNDN);
        mpfr_exp(r33543, r33541, MPFR_RNDN);
        mpfr_log(r33544, r33543, MPFR_RNDN);
        mpfr_mul(r33545, r33536, r33544, MPFR_RNDN);
        mpfr_mul(r33546, r33542, r33545, MPFR_RNDN);
        mpfr_sub(r33547, r33537, r33530, MPFR_RNDN);
        mpfr_mul(r33548, r33547, r33547, MPFR_RNDN);
        mpfr_add(r33549, r33546, r33548, MPFR_RNDN);
        mpfr_sqrt(r33550, r33549, MPFR_RNDN);
        mpfr_mul(r33551, r33533, r33550, MPFR_RNDN);
        mpfr_sub(r33552, r33530, r33537, MPFR_RNDN);
        mpfr_mul(r33553, r33533, r33552, MPFR_RNDN);
        if (mpfr_get_si(r33532, MPFR_RNDN)) { mpfr_set(r33554, r33551, MPFR_RNDN); } else { mpfr_set(r33554, r33553, MPFR_RNDN); };
        return mpfr_get_d(r33554, MPFR_RNDN);
}

static mpfr_t r33555, r33556, r33557, r33558, r33559, r33560, r33561, r33562, r33563, r33564, r33565, r33566, r33567, r33568, r33569, r33570, r33571, r33572, r33573, r33574, r33575, r33576, r33577, r33578, r33579;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33555);
        mpfr_init_set_str(r33556, "2.8760683199294135e+153", 10, MPFR_RNDN);
        mpfr_init(r33557);
        mpfr_init(r33558);
        mpfr_init(r33559);
        mpfr_init(r33560);
        mpfr_init(r33561);
        mpfr_init(r33562);
        mpfr_init(r33563);
        mpfr_init_set_str(r33564, "2", 10, MPFR_RNDN);
        mpfr_init(r33565);
        mpfr_init(r33566);
        mpfr_init(r33567);
        mpfr_init(r33568);
        mpfr_init(r33569);
        mpfr_init(r33570);
        mpfr_init(r33571);
        mpfr_init(r33572);
        mpfr_init(r33573);
        mpfr_init(r33574);
        mpfr_init(r33575);
        mpfr_init(r33576);
        mpfr_init(r33577);
        mpfr_init(r33578);
        mpfr_init(r33579);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33555, phi2, MPFR_RNDN);
        ;
        mpfr_set_si(r33557, mpfr_cmp(r33555, r33556) <= 0, MPFR_RNDN);
        mpfr_set_d(r33558, R, MPFR_RNDN);
        mpfr_set_d(r33559, lambda1, MPFR_RNDN);
        mpfr_set_d(r33560, lambda2, MPFR_RNDN);
        mpfr_sub(r33561, r33559, r33560, MPFR_RNDN);
        mpfr_set_d(r33562, phi1, MPFR_RNDN);
        mpfr_add(r33563, r33562, r33555, MPFR_RNDN);
        ;
        mpfr_div(r33565, r33563, r33564, MPFR_RNDN);
        mpfr_cos(r33566, r33565, MPFR_RNDN);
        mpfr_mul(r33567, r33561, r33566, MPFR_RNDN);
        mpfr_exp(r33568, r33566, MPFR_RNDN);
        mpfr_log(r33569, r33568, MPFR_RNDN);
        mpfr_mul(r33570, r33561, r33569, MPFR_RNDN);
        mpfr_mul(r33571, r33567, r33570, MPFR_RNDN);
        mpfr_sub(r33572, r33562, r33555, MPFR_RNDN);
        mpfr_mul(r33573, r33572, r33572, MPFR_RNDN);
        mpfr_add(r33574, r33571, r33573, MPFR_RNDN);
        mpfr_sqrt(r33575, r33574, MPFR_RNDN);
        mpfr_mul(r33576, r33558, r33575, MPFR_RNDN);
        mpfr_sub(r33577, r33555, r33562, MPFR_RNDN);
        mpfr_mul(r33578, r33558, r33577, MPFR_RNDN);
        if (mpfr_get_si(r33557, MPFR_RNDN)) { mpfr_set(r33579, r33576, MPFR_RNDN); } else { mpfr_set(r33579, r33578, MPFR_RNDN); };
        return mpfr_get_d(r33579, MPFR_RNDN);
}

