#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 r33441 = R;
        float r33442 = lambda1;
        float r33443 = lambda2;
        float r33444 = r33442 - r33443;
        float r33445 = phi1;
        float r33446 = phi2;
        float r33447 = r33445 + r33446;
        float r33448 = 2;
        float r33449 = r33447 / r33448;
        float r33450 = cos(r33449);
        float r33451 = r33444 * r33450;
        float r33452 = r33451 * r33451;
        float r33453 = r33445 - r33446;
        float r33454 = r33453 * r33453;
        float r33455 = r33452 + r33454;
        float r33456 = sqrt(r33455);
        float r33457 = r33441 * r33456;
        return r33457;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33458 = R;
        double r33459 = lambda1;
        double r33460 = lambda2;
        double r33461 = r33459 - r33460;
        double r33462 = phi1;
        double r33463 = phi2;
        double r33464 = r33462 + r33463;
        double r33465 = 2;
        double r33466 = r33464 / r33465;
        double r33467 = cos(r33466);
        double r33468 = r33461 * r33467;
        double r33469 = r33468 * r33468;
        double r33470 = r33462 - r33463;
        double r33471 = r33470 * r33470;
        double r33472 = r33469 + r33471;
        double r33473 = sqrt(r33472);
        double r33474 = r33458 * r33473;
        return r33474;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r33475 = phi2;
        float r33476 = 5.010541173451153e+162;
        bool r33477 = r33475 <= r33476;
        float r33478 = R;
        float r33479 = lambda1;
        float r33480 = lambda2;
        float r33481 = r33479 - r33480;
        float r33482 = phi1;
        float r33483 = r33482 + r33475;
        float r33484 = 2;
        float r33485 = r33483 / r33484;
        float r33486 = cos(r33485);
        float r33487 = r33481 * r33486;
        float r33488 = exp(r33486);
        float r33489 = log(r33488);
        float r33490 = r33481 * r33489;
        float r33491 = r33487 * r33490;
        float r33492 = r33482 - r33475;
        float r33493 = r33492 * r33492;
        float r33494 = r33491 + r33493;
        float r33495 = sqrt(r33494);
        float r33496 = r33478 * r33495;
        float r33497 = r33475 - r33482;
        float r33498 = r33478 * r33497;
        float r33499 = r33477 ? r33496 : r33498;
        return r33499;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33500 = phi2;
        double r33501 = 5.010541173451153e+162;
        bool r33502 = r33500 <= r33501;
        double r33503 = R;
        double r33504 = lambda1;
        double r33505 = lambda2;
        double r33506 = r33504 - r33505;
        double r33507 = phi1;
        double r33508 = r33507 + r33500;
        double r33509 = 2;
        double r33510 = r33508 / r33509;
        double r33511 = cos(r33510);
        double r33512 = r33506 * r33511;
        double r33513 = exp(r33511);
        double r33514 = log(r33513);
        double r33515 = r33506 * r33514;
        double r33516 = r33512 * r33515;
        double r33517 = r33507 - r33500;
        double r33518 = r33517 * r33517;
        double r33519 = r33516 + r33518;
        double r33520 = sqrt(r33519);
        double r33521 = r33503 * r33520;
        double r33522 = r33500 - r33507;
        double r33523 = r33503 * r33522;
        double r33524 = r33502 ? r33521 : r33523;
        return r33524;
}

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 r33525, r33526, r33527, r33528, r33529, r33530, r33531, r33532, r33533, r33534, r33535, r33536, r33537, r33538, r33539, r33540, r33541;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33525);
        mpfr_init(r33526);
        mpfr_init(r33527);
        mpfr_init(r33528);
        mpfr_init(r33529);
        mpfr_init(r33530);
        mpfr_init(r33531);
        mpfr_init_set_str(r33532, "2", 10, MPFR_RNDN);
        mpfr_init(r33533);
        mpfr_init(r33534);
        mpfr_init(r33535);
        mpfr_init(r33536);
        mpfr_init(r33537);
        mpfr_init(r33538);
        mpfr_init(r33539);
        mpfr_init(r33540);
        mpfr_init(r33541);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33525, R, MPFR_RNDN);
        mpfr_set_d(r33526, lambda1, MPFR_RNDN);
        mpfr_set_d(r33527, lambda2, MPFR_RNDN);
        mpfr_sub(r33528, r33526, r33527, MPFR_RNDN);
        mpfr_set_d(r33529, phi1, MPFR_RNDN);
        mpfr_set_d(r33530, phi2, MPFR_RNDN);
        mpfr_add(r33531, r33529, r33530, MPFR_RNDN);
        ;
        mpfr_div(r33533, r33531, r33532, MPFR_RNDN);
        mpfr_cos(r33534, r33533, MPFR_RNDN);
        mpfr_mul(r33535, r33528, r33534, MPFR_RNDN);
        mpfr_mul(r33536, r33535, r33535, MPFR_RNDN);
        mpfr_sub(r33537, r33529, r33530, MPFR_RNDN);
        mpfr_mul(r33538, r33537, r33537, MPFR_RNDN);
        mpfr_add(r33539, r33536, r33538, MPFR_RNDN);
        mpfr_sqrt(r33540, r33539, MPFR_RNDN);
        mpfr_mul(r33541, r33525, r33540, MPFR_RNDN);
        return mpfr_get_d(r33541, MPFR_RNDN);
}

static mpfr_t r33542, r33543, r33544, r33545, r33546, r33547, r33548, r33549, r33550, r33551, r33552, r33553, r33554, r33555, r33556, r33557, r33558, r33559, r33560, r33561, r33562, r33563, r33564, r33565, r33566;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33542);
        mpfr_init_set_str(r33543, "5.010541173451153e+162", 10, MPFR_RNDN);
        mpfr_init(r33544);
        mpfr_init(r33545);
        mpfr_init(r33546);
        mpfr_init(r33547);
        mpfr_init(r33548);
        mpfr_init(r33549);
        mpfr_init(r33550);
        mpfr_init_set_str(r33551, "2", 10, MPFR_RNDN);
        mpfr_init(r33552);
        mpfr_init(r33553);
        mpfr_init(r33554);
        mpfr_init(r33555);
        mpfr_init(r33556);
        mpfr_init(r33557);
        mpfr_init(r33558);
        mpfr_init(r33559);
        mpfr_init(r33560);
        mpfr_init(r33561);
        mpfr_init(r33562);
        mpfr_init(r33563);
        mpfr_init(r33564);
        mpfr_init(r33565);
        mpfr_init(r33566);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33542, phi2, MPFR_RNDN);
        ;
        mpfr_set_si(r33544, mpfr_cmp(r33542, r33543) <= 0, MPFR_RNDN);
        mpfr_set_d(r33545, R, MPFR_RNDN);
        mpfr_set_d(r33546, lambda1, MPFR_RNDN);
        mpfr_set_d(r33547, lambda2, MPFR_RNDN);
        mpfr_sub(r33548, r33546, r33547, MPFR_RNDN);
        mpfr_set_d(r33549, phi1, MPFR_RNDN);
        mpfr_add(r33550, r33549, r33542, MPFR_RNDN);
        ;
        mpfr_div(r33552, r33550, r33551, MPFR_RNDN);
        mpfr_cos(r33553, r33552, MPFR_RNDN);
        mpfr_mul(r33554, r33548, r33553, MPFR_RNDN);
        mpfr_exp(r33555, r33553, MPFR_RNDN);
        mpfr_log(r33556, r33555, MPFR_RNDN);
        mpfr_mul(r33557, r33548, r33556, MPFR_RNDN);
        mpfr_mul(r33558, r33554, r33557, MPFR_RNDN);
        mpfr_sub(r33559, r33549, r33542, MPFR_RNDN);
        mpfr_mul(r33560, r33559, r33559, MPFR_RNDN);
        mpfr_add(r33561, r33558, r33560, MPFR_RNDN);
        mpfr_sqrt(r33562, r33561, MPFR_RNDN);
        mpfr_mul(r33563, r33545, r33562, MPFR_RNDN);
        mpfr_sub(r33564, r33542, r33549, MPFR_RNDN);
        mpfr_mul(r33565, r33545, r33564, MPFR_RNDN);
        if (mpfr_get_si(r33544, MPFR_RNDN)) { mpfr_set(r33566, r33563, MPFR_RNDN); } else { mpfr_set(r33566, r33565, MPFR_RNDN); };
        return mpfr_get_d(r33566, MPFR_RNDN);
}

static mpfr_t r33567, r33568, r33569, r33570, r33571, r33572, r33573, r33574, r33575, r33576, r33577, r33578, r33579, r33580, r33581, r33582, r33583, r33584, r33585, r33586, r33587, r33588, r33589, r33590, r33591;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33567);
        mpfr_init_set_str(r33568, "5.010541173451153e+162", 10, MPFR_RNDN);
        mpfr_init(r33569);
        mpfr_init(r33570);
        mpfr_init(r33571);
        mpfr_init(r33572);
        mpfr_init(r33573);
        mpfr_init(r33574);
        mpfr_init(r33575);
        mpfr_init_set_str(r33576, "2", 10, MPFR_RNDN);
        mpfr_init(r33577);
        mpfr_init(r33578);
        mpfr_init(r33579);
        mpfr_init(r33580);
        mpfr_init(r33581);
        mpfr_init(r33582);
        mpfr_init(r33583);
        mpfr_init(r33584);
        mpfr_init(r33585);
        mpfr_init(r33586);
        mpfr_init(r33587);
        mpfr_init(r33588);
        mpfr_init(r33589);
        mpfr_init(r33590);
        mpfr_init(r33591);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33567, phi2, MPFR_RNDN);
        ;
        mpfr_set_si(r33569, mpfr_cmp(r33567, r33568) <= 0, MPFR_RNDN);
        mpfr_set_d(r33570, R, MPFR_RNDN);
        mpfr_set_d(r33571, lambda1, MPFR_RNDN);
        mpfr_set_d(r33572, lambda2, MPFR_RNDN);
        mpfr_sub(r33573, r33571, r33572, MPFR_RNDN);
        mpfr_set_d(r33574, phi1, MPFR_RNDN);
        mpfr_add(r33575, r33574, r33567, MPFR_RNDN);
        ;
        mpfr_div(r33577, r33575, r33576, MPFR_RNDN);
        mpfr_cos(r33578, r33577, MPFR_RNDN);
        mpfr_mul(r33579, r33573, r33578, MPFR_RNDN);
        mpfr_exp(r33580, r33578, MPFR_RNDN);
        mpfr_log(r33581, r33580, MPFR_RNDN);
        mpfr_mul(r33582, r33573, r33581, MPFR_RNDN);
        mpfr_mul(r33583, r33579, r33582, MPFR_RNDN);
        mpfr_sub(r33584, r33574, r33567, MPFR_RNDN);
        mpfr_mul(r33585, r33584, r33584, MPFR_RNDN);
        mpfr_add(r33586, r33583, r33585, MPFR_RNDN);
        mpfr_sqrt(r33587, r33586, MPFR_RNDN);
        mpfr_mul(r33588, r33570, r33587, MPFR_RNDN);
        mpfr_sub(r33589, r33567, r33574, MPFR_RNDN);
        mpfr_mul(r33590, r33570, r33589, MPFR_RNDN);
        if (mpfr_get_si(r33569, MPFR_RNDN)) { mpfr_set(r33591, r33588, MPFR_RNDN); } else { mpfr_set(r33591, r33590, MPFR_RNDN); };
        return mpfr_get_d(r33591, MPFR_RNDN);
}

