#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 r32662 = lambda1;
        float r32663 = lambda2;
        float r32664 = r32662 - r32663;
        float r32665 = sin(r32664);
        float r32666 = phi2;
        float r32667 = cos(r32666);
        float r32668 = r32665 * r32667;
        float r32669 = phi1;
        float r32670 = cos(r32669);
        float r32671 = sin(r32666);
        float r32672 = r32670 * r32671;
        float r32673 = sin(r32669);
        float r32674 = r32673 * r32667;
        float r32675 = cos(r32664);
        float r32676 = r32674 * r32675;
        float r32677 = r32672 - r32676;
        float r32678 = atan2(r32668, r32677);
        return r32678;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r32679 = lambda1;
        double r32680 = lambda2;
        double r32681 = r32679 - r32680;
        double r32682 = sin(r32681);
        double r32683 = phi2;
        double r32684 = cos(r32683);
        double r32685 = r32682 * r32684;
        double r32686 = phi1;
        double r32687 = cos(r32686);
        double r32688 = sin(r32683);
        double r32689 = r32687 * r32688;
        double r32690 = sin(r32686);
        double r32691 = r32690 * r32684;
        double r32692 = cos(r32681);
        double r32693 = r32691 * r32692;
        double r32694 = r32689 - r32693;
        double r32695 = atan2(r32685, r32694);
        return r32695;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r32696 = lambda2;
        float r32697 = cos(r32696);
        float r32698 = lambda1;
        float r32699 = sin(r32698);
        float r32700 = r32697 * r32699;
        float r32701 = cos(r32698);
        float r32702 = -r32696;
        float r32703 = sin(r32702);
        float r32704 = r32701 * r32703;
        float r32705 = r32700 + r32704;
        float r32706 = phi2;
        float r32707 = cos(r32706);
        float r32708 = r32705 * r32707;
        float r32709 = phi1;
        float r32710 = cos(r32709);
        float r32711 = sin(r32706);
        float r32712 = r32710 * r32711;
        float r32713 = sin(r32709);
        float r32714 = r32713 * r32707;
        float r32715 = r32697 * r32701;
        float r32716 = r32699 * r32703;
        float r32717 = r32715 - r32716;
        float r32718 = r32714 * r32717;
        float r32719 = r32712 - r32718;
        float r32720 = atan2(r32708, r32719);
        return r32720;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r32721 = lambda2;
        double r32722 = cos(r32721);
        double r32723 = lambda1;
        double r32724 = sin(r32723);
        double r32725 = r32722 * r32724;
        double r32726 = cos(r32723);
        double r32727 = -r32721;
        double r32728 = sin(r32727);
        double r32729 = r32726 * r32728;
        double r32730 = r32725 + r32729;
        double r32731 = phi2;
        double r32732 = cos(r32731);
        double r32733 = r32730 * r32732;
        double r32734 = phi1;
        double r32735 = cos(r32734);
        double r32736 = sin(r32731);
        double r32737 = r32735 * r32736;
        double r32738 = sin(r32734);
        double r32739 = r32738 * r32732;
        double r32740 = r32722 * r32726;
        double r32741 = r32724 * r32728;
        double r32742 = r32740 - r32741;
        double r32743 = r32739 * r32742;
        double r32744 = r32737 - r32743;
        double r32745 = atan2(r32733, r32744);
        return r32745;
}

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 r32746, r32747, r32748, r32749, r32750, r32751, r32752, r32753, r32754, r32755, r32756, r32757, r32758, r32759, r32760, r32761, r32762;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r32746);
        mpfr_init(r32747);
        mpfr_init(r32748);
        mpfr_init(r32749);
        mpfr_init(r32750);
        mpfr_init(r32751);
        mpfr_init(r32752);
        mpfr_init(r32753);
        mpfr_init(r32754);
        mpfr_init(r32755);
        mpfr_init(r32756);
        mpfr_init(r32757);
        mpfr_init(r32758);
        mpfr_init(r32759);
        mpfr_init(r32760);
        mpfr_init(r32761);
        mpfr_init(r32762);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r32746, lambda1, MPFR_RNDN);
        mpfr_set_d(r32747, lambda2, MPFR_RNDN);
        mpfr_sub(r32748, r32746, r32747, MPFR_RNDN);
        mpfr_sin(r32749, r32748, MPFR_RNDN);
        mpfr_set_d(r32750, phi2, MPFR_RNDN);
        mpfr_cos(r32751, r32750, MPFR_RNDN);
        mpfr_mul(r32752, r32749, r32751, MPFR_RNDN);
        mpfr_set_d(r32753, phi1, MPFR_RNDN);
        mpfr_cos(r32754, r32753, MPFR_RNDN);
        mpfr_sin(r32755, r32750, MPFR_RNDN);
        mpfr_mul(r32756, r32754, r32755, MPFR_RNDN);
        mpfr_sin(r32757, r32753, MPFR_RNDN);
        mpfr_mul(r32758, r32757, r32751, MPFR_RNDN);
        mpfr_cos(r32759, r32748, MPFR_RNDN);
        mpfr_mul(r32760, r32758, r32759, MPFR_RNDN);
        mpfr_sub(r32761, r32756, r32760, MPFR_RNDN);
        mpfr_atan2(r32762, r32752, r32761, MPFR_RNDN);
        return mpfr_get_d(r32762, MPFR_RNDN);
}

static mpfr_t r32763, r32764, r32765, r32766, r32767, r32768, r32769, r32770, r32771, r32772, r32773, r32774, r32775, r32776, r32777, r32778, r32779, r32780, r32781, r32782, r32783, r32784, r32785, r32786, r32787;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r32763);
        mpfr_init(r32764);
        mpfr_init(r32765);
        mpfr_init(r32766);
        mpfr_init(r32767);
        mpfr_init(r32768);
        mpfr_init(r32769);
        mpfr_init(r32770);
        mpfr_init(r32771);
        mpfr_init(r32772);
        mpfr_init(r32773);
        mpfr_init(r32774);
        mpfr_init(r32775);
        mpfr_init(r32776);
        mpfr_init(r32777);
        mpfr_init(r32778);
        mpfr_init(r32779);
        mpfr_init(r32780);
        mpfr_init(r32781);
        mpfr_init(r32782);
        mpfr_init(r32783);
        mpfr_init(r32784);
        mpfr_init(r32785);
        mpfr_init(r32786);
        mpfr_init(r32787);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r32763, lambda2, MPFR_RNDN);
        mpfr_cos(r32764, r32763, MPFR_RNDN);
        mpfr_set_d(r32765, lambda1, MPFR_RNDN);
        mpfr_sin(r32766, r32765, MPFR_RNDN);
        mpfr_mul(r32767, r32764, r32766, MPFR_RNDN);
        mpfr_cos(r32768, r32765, MPFR_RNDN);
        mpfr_neg(r32769, r32763, MPFR_RNDN);
        mpfr_sin(r32770, r32769, MPFR_RNDN);
        mpfr_mul(r32771, r32768, r32770, MPFR_RNDN);
        mpfr_add(r32772, r32767, r32771, MPFR_RNDN);
        mpfr_set_d(r32773, phi2, MPFR_RNDN);
        mpfr_cos(r32774, r32773, MPFR_RNDN);
        mpfr_mul(r32775, r32772, r32774, MPFR_RNDN);
        mpfr_set_d(r32776, phi1, MPFR_RNDN);
        mpfr_cos(r32777, r32776, MPFR_RNDN);
        mpfr_sin(r32778, r32773, MPFR_RNDN);
        mpfr_mul(r32779, r32777, r32778, MPFR_RNDN);
        mpfr_sin(r32780, r32776, MPFR_RNDN);
        mpfr_mul(r32781, r32780, r32774, MPFR_RNDN);
        mpfr_mul(r32782, r32764, r32768, MPFR_RNDN);
        mpfr_mul(r32783, r32766, r32770, MPFR_RNDN);
        mpfr_sub(r32784, r32782, r32783, MPFR_RNDN);
        mpfr_mul(r32785, r32781, r32784, MPFR_RNDN);
        mpfr_sub(r32786, r32779, r32785, MPFR_RNDN);
        mpfr_atan2(r32787, r32775, r32786, MPFR_RNDN);
        return mpfr_get_d(r32787, MPFR_RNDN);
}

static mpfr_t r32788, r32789, r32790, r32791, r32792, r32793, r32794, r32795, r32796, r32797, r32798, r32799, r32800, r32801, r32802, r32803, r32804, r32805, r32806, r32807, r32808, r32809, r32810, r32811, r32812;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r32788);
        mpfr_init(r32789);
        mpfr_init(r32790);
        mpfr_init(r32791);
        mpfr_init(r32792);
        mpfr_init(r32793);
        mpfr_init(r32794);
        mpfr_init(r32795);
        mpfr_init(r32796);
        mpfr_init(r32797);
        mpfr_init(r32798);
        mpfr_init(r32799);
        mpfr_init(r32800);
        mpfr_init(r32801);
        mpfr_init(r32802);
        mpfr_init(r32803);
        mpfr_init(r32804);
        mpfr_init(r32805);
        mpfr_init(r32806);
        mpfr_init(r32807);
        mpfr_init(r32808);
        mpfr_init(r32809);
        mpfr_init(r32810);
        mpfr_init(r32811);
        mpfr_init(r32812);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r32788, lambda2, MPFR_RNDN);
        mpfr_cos(r32789, r32788, MPFR_RNDN);
        mpfr_set_d(r32790, lambda1, MPFR_RNDN);
        mpfr_sin(r32791, r32790, MPFR_RNDN);
        mpfr_mul(r32792, r32789, r32791, MPFR_RNDN);
        mpfr_cos(r32793, r32790, MPFR_RNDN);
        mpfr_neg(r32794, r32788, MPFR_RNDN);
        mpfr_sin(r32795, r32794, MPFR_RNDN);
        mpfr_mul(r32796, r32793, r32795, MPFR_RNDN);
        mpfr_add(r32797, r32792, r32796, MPFR_RNDN);
        mpfr_set_d(r32798, phi2, MPFR_RNDN);
        mpfr_cos(r32799, r32798, MPFR_RNDN);
        mpfr_mul(r32800, r32797, r32799, MPFR_RNDN);
        mpfr_set_d(r32801, phi1, MPFR_RNDN);
        mpfr_cos(r32802, r32801, MPFR_RNDN);
        mpfr_sin(r32803, r32798, MPFR_RNDN);
        mpfr_mul(r32804, r32802, r32803, MPFR_RNDN);
        mpfr_sin(r32805, r32801, MPFR_RNDN);
        mpfr_mul(r32806, r32805, r32799, MPFR_RNDN);
        mpfr_mul(r32807, r32789, r32793, MPFR_RNDN);
        mpfr_mul(r32808, r32791, r32795, MPFR_RNDN);
        mpfr_sub(r32809, r32807, r32808, MPFR_RNDN);
        mpfr_mul(r32810, r32806, r32809, MPFR_RNDN);
        mpfr_sub(r32811, r32804, r32810, MPFR_RNDN);
        mpfr_atan2(r32812, r32800, r32811, MPFR_RNDN);
        return mpfr_get_d(r32812, MPFR_RNDN);
}

