#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 r36550 = lambda1;
        float r36551 = lambda2;
        float r36552 = r36550 - r36551;
        float r36553 = sin(r36552);
        float r36554 = phi2;
        float r36555 = cos(r36554);
        float r36556 = r36553 * r36555;
        float r36557 = phi1;
        float r36558 = cos(r36557);
        float r36559 = sin(r36554);
        float r36560 = r36558 * r36559;
        float r36561 = sin(r36557);
        float r36562 = r36561 * r36555;
        float r36563 = cos(r36552);
        float r36564 = r36562 * r36563;
        float r36565 = r36560 - r36564;
        float r36566 = atan2(r36556, r36565);
        return r36566;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r36567 = lambda1;
        double r36568 = lambda2;
        double r36569 = r36567 - r36568;
        double r36570 = sin(r36569);
        double r36571 = phi2;
        double r36572 = cos(r36571);
        double r36573 = r36570 * r36572;
        double r36574 = phi1;
        double r36575 = cos(r36574);
        double r36576 = sin(r36571);
        double r36577 = r36575 * r36576;
        double r36578 = sin(r36574);
        double r36579 = r36578 * r36572;
        double r36580 = cos(r36569);
        double r36581 = r36579 * r36580;
        double r36582 = r36577 - r36581;
        double r36583 = atan2(r36573, r36582);
        return r36583;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r36584 = lambda1;
        float r36585 = sin(r36584);
        float r36586 = lambda2;
        float r36587 = cos(r36586);
        float r36588 = r36585 * r36587;
        float r36589 = cos(r36584);
        float r36590 = -r36586;
        float r36591 = sin(r36590);
        float r36592 = r36589 * r36591;
        float r36593 = r36588 + r36592;
        float r36594 = phi2;
        float r36595 = cos(r36594);
        float r36596 = r36593 * r36595;
        float r36597 = phi1;
        float r36598 = cos(r36597);
        float r36599 = sin(r36594);
        float r36600 = r36598 * r36599;
        float r36601 = sin(r36597);
        float r36602 = r36589 * r36587;
        float r36603 = r36585 * r36591;
        float r36604 = r36602 - r36603;
        float r36605 = r36595 * r36604;
        float r36606 = r36601 * r36605;
        float r36607 = r36600 - r36606;
        float r36608 = atan2(r36596, r36607);
        return r36608;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r36609 = lambda1;
        double r36610 = sin(r36609);
        double r36611 = lambda2;
        double r36612 = cos(r36611);
        double r36613 = r36610 * r36612;
        double r36614 = cos(r36609);
        double r36615 = -r36611;
        double r36616 = sin(r36615);
        double r36617 = r36614 * r36616;
        double r36618 = r36613 + r36617;
        double r36619 = phi2;
        double r36620 = cos(r36619);
        double r36621 = r36618 * r36620;
        double r36622 = phi1;
        double r36623 = cos(r36622);
        double r36624 = sin(r36619);
        double r36625 = r36623 * r36624;
        double r36626 = sin(r36622);
        double r36627 = r36614 * r36612;
        double r36628 = r36610 * r36616;
        double r36629 = r36627 - r36628;
        double r36630 = r36620 * r36629;
        double r36631 = r36626 * r36630;
        double r36632 = r36625 - r36631;
        double r36633 = atan2(r36621, r36632);
        return r36633;
}

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 r36634, r36635, r36636, r36637, r36638, r36639, r36640, r36641, r36642, r36643, r36644, r36645, r36646, r36647, r36648, r36649, r36650;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36634);
        mpfr_init(r36635);
        mpfr_init(r36636);
        mpfr_init(r36637);
        mpfr_init(r36638);
        mpfr_init(r36639);
        mpfr_init(r36640);
        mpfr_init(r36641);
        mpfr_init(r36642);
        mpfr_init(r36643);
        mpfr_init(r36644);
        mpfr_init(r36645);
        mpfr_init(r36646);
        mpfr_init(r36647);
        mpfr_init(r36648);
        mpfr_init(r36649);
        mpfr_init(r36650);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36634, lambda1, MPFR_RNDN);
        mpfr_set_d(r36635, lambda2, MPFR_RNDN);
        mpfr_sub(r36636, r36634, r36635, MPFR_RNDN);
        mpfr_sin(r36637, r36636, MPFR_RNDN);
        mpfr_set_d(r36638, phi2, MPFR_RNDN);
        mpfr_cos(r36639, r36638, MPFR_RNDN);
        mpfr_mul(r36640, r36637, r36639, MPFR_RNDN);
        mpfr_set_d(r36641, phi1, MPFR_RNDN);
        mpfr_cos(r36642, r36641, MPFR_RNDN);
        mpfr_sin(r36643, r36638, MPFR_RNDN);
        mpfr_mul(r36644, r36642, r36643, MPFR_RNDN);
        mpfr_sin(r36645, r36641, MPFR_RNDN);
        mpfr_mul(r36646, r36645, r36639, MPFR_RNDN);
        mpfr_cos(r36647, r36636, MPFR_RNDN);
        mpfr_mul(r36648, r36646, r36647, MPFR_RNDN);
        mpfr_sub(r36649, r36644, r36648, MPFR_RNDN);
        mpfr_atan2(r36650, r36640, r36649, MPFR_RNDN);
        return mpfr_get_d(r36650, MPFR_RNDN);
}

static mpfr_t r36651, r36652, r36653, r36654, r36655, r36656, r36657, r36658, r36659, r36660, r36661, r36662, r36663, r36664, r36665, r36666, r36667, r36668, r36669, r36670, r36671, r36672, r36673, r36674, r36675;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36651);
        mpfr_init(r36652);
        mpfr_init(r36653);
        mpfr_init(r36654);
        mpfr_init(r36655);
        mpfr_init(r36656);
        mpfr_init(r36657);
        mpfr_init(r36658);
        mpfr_init(r36659);
        mpfr_init(r36660);
        mpfr_init(r36661);
        mpfr_init(r36662);
        mpfr_init(r36663);
        mpfr_init(r36664);
        mpfr_init(r36665);
        mpfr_init(r36666);
        mpfr_init(r36667);
        mpfr_init(r36668);
        mpfr_init(r36669);
        mpfr_init(r36670);
        mpfr_init(r36671);
        mpfr_init(r36672);
        mpfr_init(r36673);
        mpfr_init(r36674);
        mpfr_init(r36675);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36651, lambda1, MPFR_RNDN);
        mpfr_sin(r36652, r36651, MPFR_RNDN);
        mpfr_set_d(r36653, lambda2, MPFR_RNDN);
        mpfr_cos(r36654, r36653, MPFR_RNDN);
        mpfr_mul(r36655, r36652, r36654, MPFR_RNDN);
        mpfr_cos(r36656, r36651, MPFR_RNDN);
        mpfr_neg(r36657, r36653, MPFR_RNDN);
        mpfr_sin(r36658, r36657, MPFR_RNDN);
        mpfr_mul(r36659, r36656, r36658, MPFR_RNDN);
        mpfr_add(r36660, r36655, r36659, MPFR_RNDN);
        mpfr_set_d(r36661, phi2, MPFR_RNDN);
        mpfr_cos(r36662, r36661, MPFR_RNDN);
        mpfr_mul(r36663, r36660, r36662, MPFR_RNDN);
        mpfr_set_d(r36664, phi1, MPFR_RNDN);
        mpfr_cos(r36665, r36664, MPFR_RNDN);
        mpfr_sin(r36666, r36661, MPFR_RNDN);
        mpfr_mul(r36667, r36665, r36666, MPFR_RNDN);
        mpfr_sin(r36668, r36664, MPFR_RNDN);
        mpfr_mul(r36669, r36656, r36654, MPFR_RNDN);
        mpfr_mul(r36670, r36652, r36658, MPFR_RNDN);
        mpfr_sub(r36671, r36669, r36670, MPFR_RNDN);
        mpfr_mul(r36672, r36662, r36671, MPFR_RNDN);
        mpfr_mul(r36673, r36668, r36672, MPFR_RNDN);
        mpfr_sub(r36674, r36667, r36673, MPFR_RNDN);
        mpfr_atan2(r36675, r36663, r36674, MPFR_RNDN);
        return mpfr_get_d(r36675, MPFR_RNDN);
}

static mpfr_t r36676, r36677, r36678, r36679, r36680, r36681, r36682, r36683, r36684, r36685, r36686, r36687, r36688, r36689, r36690, r36691, r36692, r36693, r36694, r36695, r36696, r36697, r36698, r36699, r36700;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36676);
        mpfr_init(r36677);
        mpfr_init(r36678);
        mpfr_init(r36679);
        mpfr_init(r36680);
        mpfr_init(r36681);
        mpfr_init(r36682);
        mpfr_init(r36683);
        mpfr_init(r36684);
        mpfr_init(r36685);
        mpfr_init(r36686);
        mpfr_init(r36687);
        mpfr_init(r36688);
        mpfr_init(r36689);
        mpfr_init(r36690);
        mpfr_init(r36691);
        mpfr_init(r36692);
        mpfr_init(r36693);
        mpfr_init(r36694);
        mpfr_init(r36695);
        mpfr_init(r36696);
        mpfr_init(r36697);
        mpfr_init(r36698);
        mpfr_init(r36699);
        mpfr_init(r36700);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36676, lambda1, MPFR_RNDN);
        mpfr_sin(r36677, r36676, MPFR_RNDN);
        mpfr_set_d(r36678, lambda2, MPFR_RNDN);
        mpfr_cos(r36679, r36678, MPFR_RNDN);
        mpfr_mul(r36680, r36677, r36679, MPFR_RNDN);
        mpfr_cos(r36681, r36676, MPFR_RNDN);
        mpfr_neg(r36682, r36678, MPFR_RNDN);
        mpfr_sin(r36683, r36682, MPFR_RNDN);
        mpfr_mul(r36684, r36681, r36683, MPFR_RNDN);
        mpfr_add(r36685, r36680, r36684, MPFR_RNDN);
        mpfr_set_d(r36686, phi2, MPFR_RNDN);
        mpfr_cos(r36687, r36686, MPFR_RNDN);
        mpfr_mul(r36688, r36685, r36687, MPFR_RNDN);
        mpfr_set_d(r36689, phi1, MPFR_RNDN);
        mpfr_cos(r36690, r36689, MPFR_RNDN);
        mpfr_sin(r36691, r36686, MPFR_RNDN);
        mpfr_mul(r36692, r36690, r36691, MPFR_RNDN);
        mpfr_sin(r36693, r36689, MPFR_RNDN);
        mpfr_mul(r36694, r36681, r36679, MPFR_RNDN);
        mpfr_mul(r36695, r36677, r36683, MPFR_RNDN);
        mpfr_sub(r36696, r36694, r36695, MPFR_RNDN);
        mpfr_mul(r36697, r36687, r36696, MPFR_RNDN);
        mpfr_mul(r36698, r36693, r36697, MPFR_RNDN);
        mpfr_sub(r36699, r36692, r36698, MPFR_RNDN);
        mpfr_atan2(r36700, r36688, r36699, MPFR_RNDN);
        return mpfr_get_d(r36700, MPFR_RNDN);
}

