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

char *name = "Bearing on a great circle";

double f_if(float lambda1, float lambda2, float phi1, float phi2) {
        float r10393 = lambda1;
        float r10394 = lambda2;
        float r10395 = r10393 - r10394;
        float r10396 = sin(r10395);
        float r10397 = phi2;
        float r10398 = cos(r10397);
        float r10399 = r10396 * r10398;
        float r10400 = phi1;
        float r10401 = cos(r10400);
        float r10402 = sin(r10397);
        float r10403 = r10401 * r10402;
        float r10404 = sin(r10400);
        float r10405 = r10404 * r10398;
        float r10406 = cos(r10395);
        float r10407 = r10405 * r10406;
        float r10408 = r10403 - r10407;
        float r10409 = atan2(r10399, r10408);
        return r10409;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r10410 = lambda1;
        double r10411 = lambda2;
        double r10412 = r10410 - r10411;
        double r10413 = sin(r10412);
        double r10414 = phi2;
        double r10415 = cos(r10414);
        double r10416 = r10413 * r10415;
        double r10417 = phi1;
        double r10418 = cos(r10417);
        double r10419 = sin(r10414);
        double r10420 = r10418 * r10419;
        double r10421 = sin(r10417);
        double r10422 = r10421 * r10415;
        double r10423 = cos(r10412);
        double r10424 = r10422 * r10423;
        double r10425 = r10420 - r10424;
        double r10426 = atan2(r10416, r10425);
        return r10426;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r10427 = lambda2;
        float r10428 = cos(r10427);
        float r10429 = lambda1;
        float r10430 = sin(r10429);
        float r10431 = r10428 * r10430;
        float r10432 = cos(r10429);
        float r10433 = -r10427;
        float r10434 = sin(r10433);
        float r10435 = r10432 * r10434;
        float r10436 = r10431 + r10435;
        float r10437 = phi2;
        float r10438 = cos(r10437);
        float r10439 = r10436 * r10438;
        float r10440 = phi1;
        float r10441 = cos(r10440);
        float r10442 = sin(r10437);
        float r10443 = r10441 * r10442;
        float r10444 = sin(r10440);
        float r10445 = r10444 * r10438;
        float r10446 = r10432 * r10428;
        float r10447 = r10445 * r10446;
        float r10448 = cbrt(r10444);
        float r10449 = r10448 * r10448;
        float r10450 = r10448 * r10438;
        float r10451 = r10449 * r10450;
        float r10452 = sin(r10427);
        float r10453 = r10430 * r10452;
        float r10454 = r10451 * r10453;
        float r10455 = r10447 + r10454;
        float r10456 = r10443 - r10455;
        float r10457 = atan2(r10439, r10456);
        return r10457;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r10458 = lambda2;
        double r10459 = cos(r10458);
        double r10460 = lambda1;
        double r10461 = sin(r10460);
        double r10462 = r10459 * r10461;
        double r10463 = cos(r10460);
        double r10464 = -r10458;
        double r10465 = sin(r10464);
        double r10466 = r10463 * r10465;
        double r10467 = r10462 + r10466;
        double r10468 = phi2;
        double r10469 = cos(r10468);
        double r10470 = r10467 * r10469;
        double r10471 = phi1;
        double r10472 = cos(r10471);
        double r10473 = sin(r10468);
        double r10474 = r10472 * r10473;
        double r10475 = sin(r10471);
        double r10476 = r10475 * r10469;
        double r10477 = r10463 * r10459;
        double r10478 = r10476 * r10477;
        double r10479 = cbrt(r10475);
        double r10480 = r10479 * r10479;
        double r10481 = r10479 * r10469;
        double r10482 = r10480 * r10481;
        double r10483 = sin(r10458);
        double r10484 = r10461 * r10483;
        double r10485 = r10482 * r10484;
        double r10486 = r10478 + r10485;
        double r10487 = r10474 - r10486;
        double r10488 = atan2(r10470, r10487);
        return r10488;
}

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 r10489, r10490, r10491, r10492, r10493, r10494, r10495, r10496, r10497, r10498, r10499, r10500, r10501, r10502, r10503, r10504, r10505;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10489);
        mpfr_init(r10490);
        mpfr_init(r10491);
        mpfr_init(r10492);
        mpfr_init(r10493);
        mpfr_init(r10494);
        mpfr_init(r10495);
        mpfr_init(r10496);
        mpfr_init(r10497);
        mpfr_init(r10498);
        mpfr_init(r10499);
        mpfr_init(r10500);
        mpfr_init(r10501);
        mpfr_init(r10502);
        mpfr_init(r10503);
        mpfr_init(r10504);
        mpfr_init(r10505);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10489, lambda1, MPFR_RNDN);
        mpfr_set_d(r10490, lambda2, MPFR_RNDN);
        mpfr_sub(r10491, r10489, r10490, MPFR_RNDN);
        mpfr_sin(r10492, r10491, MPFR_RNDN);
        mpfr_set_d(r10493, phi2, MPFR_RNDN);
        mpfr_cos(r10494, r10493, MPFR_RNDN);
        mpfr_mul(r10495, r10492, r10494, MPFR_RNDN);
        mpfr_set_d(r10496, phi1, MPFR_RNDN);
        mpfr_cos(r10497, r10496, MPFR_RNDN);
        mpfr_sin(r10498, r10493, MPFR_RNDN);
        mpfr_mul(r10499, r10497, r10498, MPFR_RNDN);
        mpfr_sin(r10500, r10496, MPFR_RNDN);
        mpfr_mul(r10501, r10500, r10494, MPFR_RNDN);
        mpfr_cos(r10502, r10491, MPFR_RNDN);
        mpfr_mul(r10503, r10501, r10502, MPFR_RNDN);
        mpfr_sub(r10504, r10499, r10503, MPFR_RNDN);
        mpfr_atan2(r10505, r10495, r10504, MPFR_RNDN);
        return mpfr_get_d(r10505, MPFR_RNDN);
}

static mpfr_t r10506, r10507, r10508, r10509, r10510, r10511, r10512, r10513, r10514, r10515, r10516, r10517, r10518, r10519, r10520, r10521, r10522, r10523, r10524, r10525, r10526, r10527, r10528, r10529, r10530, r10531, r10532, r10533, r10534, r10535, r10536;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10506);
        mpfr_init(r10507);
        mpfr_init(r10508);
        mpfr_init(r10509);
        mpfr_init(r10510);
        mpfr_init(r10511);
        mpfr_init(r10512);
        mpfr_init(r10513);
        mpfr_init(r10514);
        mpfr_init(r10515);
        mpfr_init(r10516);
        mpfr_init(r10517);
        mpfr_init(r10518);
        mpfr_init(r10519);
        mpfr_init(r10520);
        mpfr_init(r10521);
        mpfr_init(r10522);
        mpfr_init(r10523);
        mpfr_init(r10524);
        mpfr_init(r10525);
        mpfr_init(r10526);
        mpfr_init(r10527);
        mpfr_init(r10528);
        mpfr_init(r10529);
        mpfr_init(r10530);
        mpfr_init(r10531);
        mpfr_init(r10532);
        mpfr_init(r10533);
        mpfr_init(r10534);
        mpfr_init(r10535);
        mpfr_init(r10536);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10506, lambda2, MPFR_RNDN);
        mpfr_cos(r10507, r10506, MPFR_RNDN);
        mpfr_set_d(r10508, lambda1, MPFR_RNDN);
        mpfr_sin(r10509, r10508, MPFR_RNDN);
        mpfr_mul(r10510, r10507, r10509, MPFR_RNDN);
        mpfr_cos(r10511, r10508, MPFR_RNDN);
        mpfr_neg(r10512, r10506, MPFR_RNDN);
        mpfr_sin(r10513, r10512, MPFR_RNDN);
        mpfr_mul(r10514, r10511, r10513, MPFR_RNDN);
        mpfr_add(r10515, r10510, r10514, MPFR_RNDN);
        mpfr_set_d(r10516, phi2, MPFR_RNDN);
        mpfr_cos(r10517, r10516, MPFR_RNDN);
        mpfr_mul(r10518, r10515, r10517, MPFR_RNDN);
        mpfr_set_d(r10519, phi1, MPFR_RNDN);
        mpfr_cos(r10520, r10519, MPFR_RNDN);
        mpfr_sin(r10521, r10516, MPFR_RNDN);
        mpfr_mul(r10522, r10520, r10521, MPFR_RNDN);
        mpfr_sin(r10523, r10519, MPFR_RNDN);
        mpfr_mul(r10524, r10523, r10517, MPFR_RNDN);
        mpfr_mul(r10525, r10511, r10507, MPFR_RNDN);
        mpfr_mul(r10526, r10524, r10525, MPFR_RNDN);
        mpfr_cbrt(r10527, r10523, MPFR_RNDN);
        mpfr_mul(r10528, r10527, r10527, MPFR_RNDN);
        mpfr_mul(r10529, r10527, r10517, MPFR_RNDN);
        mpfr_mul(r10530, r10528, r10529, MPFR_RNDN);
        mpfr_sin(r10531, r10506, MPFR_RNDN);
        mpfr_mul(r10532, r10509, r10531, MPFR_RNDN);
        mpfr_mul(r10533, r10530, r10532, MPFR_RNDN);
        mpfr_add(r10534, r10526, r10533, MPFR_RNDN);
        mpfr_sub(r10535, r10522, r10534, MPFR_RNDN);
        mpfr_atan2(r10536, r10518, r10535, MPFR_RNDN);
        return mpfr_get_d(r10536, MPFR_RNDN);
}

static mpfr_t r10537, r10538, r10539, r10540, r10541, r10542, r10543, r10544, r10545, r10546, r10547, r10548, r10549, r10550, r10551, r10552, r10553, r10554, r10555, r10556, r10557, r10558, r10559, r10560, r10561, r10562, r10563, r10564, r10565, r10566, r10567;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10537);
        mpfr_init(r10538);
        mpfr_init(r10539);
        mpfr_init(r10540);
        mpfr_init(r10541);
        mpfr_init(r10542);
        mpfr_init(r10543);
        mpfr_init(r10544);
        mpfr_init(r10545);
        mpfr_init(r10546);
        mpfr_init(r10547);
        mpfr_init(r10548);
        mpfr_init(r10549);
        mpfr_init(r10550);
        mpfr_init(r10551);
        mpfr_init(r10552);
        mpfr_init(r10553);
        mpfr_init(r10554);
        mpfr_init(r10555);
        mpfr_init(r10556);
        mpfr_init(r10557);
        mpfr_init(r10558);
        mpfr_init(r10559);
        mpfr_init(r10560);
        mpfr_init(r10561);
        mpfr_init(r10562);
        mpfr_init(r10563);
        mpfr_init(r10564);
        mpfr_init(r10565);
        mpfr_init(r10566);
        mpfr_init(r10567);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10537, lambda2, MPFR_RNDN);
        mpfr_cos(r10538, r10537, MPFR_RNDN);
        mpfr_set_d(r10539, lambda1, MPFR_RNDN);
        mpfr_sin(r10540, r10539, MPFR_RNDN);
        mpfr_mul(r10541, r10538, r10540, MPFR_RNDN);
        mpfr_cos(r10542, r10539, MPFR_RNDN);
        mpfr_neg(r10543, r10537, MPFR_RNDN);
        mpfr_sin(r10544, r10543, MPFR_RNDN);
        mpfr_mul(r10545, r10542, r10544, MPFR_RNDN);
        mpfr_add(r10546, r10541, r10545, MPFR_RNDN);
        mpfr_set_d(r10547, phi2, MPFR_RNDN);
        mpfr_cos(r10548, r10547, MPFR_RNDN);
        mpfr_mul(r10549, r10546, r10548, MPFR_RNDN);
        mpfr_set_d(r10550, phi1, MPFR_RNDN);
        mpfr_cos(r10551, r10550, MPFR_RNDN);
        mpfr_sin(r10552, r10547, MPFR_RNDN);
        mpfr_mul(r10553, r10551, r10552, MPFR_RNDN);
        mpfr_sin(r10554, r10550, MPFR_RNDN);
        mpfr_mul(r10555, r10554, r10548, MPFR_RNDN);
        mpfr_mul(r10556, r10542, r10538, MPFR_RNDN);
        mpfr_mul(r10557, r10555, r10556, MPFR_RNDN);
        mpfr_cbrt(r10558, r10554, MPFR_RNDN);
        mpfr_mul(r10559, r10558, r10558, MPFR_RNDN);
        mpfr_mul(r10560, r10558, r10548, MPFR_RNDN);
        mpfr_mul(r10561, r10559, r10560, MPFR_RNDN);
        mpfr_sin(r10562, r10537, MPFR_RNDN);
        mpfr_mul(r10563, r10540, r10562, MPFR_RNDN);
        mpfr_mul(r10564, r10561, r10563, MPFR_RNDN);
        mpfr_add(r10565, r10557, r10564, MPFR_RNDN);
        mpfr_sub(r10566, r10553, r10565, MPFR_RNDN);
        mpfr_atan2(r10567, r10549, r10566, MPFR_RNDN);
        return mpfr_get_d(r10567, MPFR_RNDN);
}

