#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 r36791 = lambda1;
        float r36792 = lambda2;
        float r36793 = r36791 - r36792;
        float r36794 = sin(r36793);
        float r36795 = phi2;
        float r36796 = cos(r36795);
        float r36797 = r36794 * r36796;
        float r36798 = phi1;
        float r36799 = cos(r36798);
        float r36800 = sin(r36795);
        float r36801 = r36799 * r36800;
        float r36802 = sin(r36798);
        float r36803 = r36802 * r36796;
        float r36804 = cos(r36793);
        float r36805 = r36803 * r36804;
        float r36806 = r36801 - r36805;
        float r36807 = atan2(r36797, r36806);
        return r36807;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r36808 = lambda1;
        double r36809 = lambda2;
        double r36810 = r36808 - r36809;
        double r36811 = sin(r36810);
        double r36812 = phi2;
        double r36813 = cos(r36812);
        double r36814 = r36811 * r36813;
        double r36815 = phi1;
        double r36816 = cos(r36815);
        double r36817 = sin(r36812);
        double r36818 = r36816 * r36817;
        double r36819 = sin(r36815);
        double r36820 = r36819 * r36813;
        double r36821 = cos(r36810);
        double r36822 = r36820 * r36821;
        double r36823 = r36818 - r36822;
        double r36824 = atan2(r36814, r36823);
        return r36824;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r36825 = lambda1;
        float r36826 = sin(r36825);
        float r36827 = lambda2;
        float r36828 = cos(r36827);
        float r36829 = r36826 * r36828;
        float r36830 = cos(r36825);
        float r36831 = -r36827;
        float r36832 = sin(r36831);
        float r36833 = r36830 * r36832;
        float r36834 = r36829 + r36833;
        float r36835 = phi2;
        float r36836 = cos(r36835);
        float r36837 = r36834 * r36836;
        float r36838 = phi1;
        float r36839 = cos(r36838);
        float r36840 = sin(r36835);
        float r36841 = r36839 * r36840;
        float r36842 = sin(r36838);
        float r36843 = r36830 * r36828;
        float r36844 = r36826 * r36832;
        float r36845 = r36843 - r36844;
        float r36846 = r36836 * r36845;
        float r36847 = r36842 * r36846;
        float r36848 = r36841 - r36847;
        float r36849 = atan2(r36837, r36848);
        return r36849;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r36850 = lambda1;
        double r36851 = sin(r36850);
        double r36852 = lambda2;
        double r36853 = cos(r36852);
        double r36854 = r36851 * r36853;
        double r36855 = cos(r36850);
        double r36856 = -r36852;
        double r36857 = sin(r36856);
        double r36858 = r36855 * r36857;
        double r36859 = r36854 + r36858;
        double r36860 = phi2;
        double r36861 = cos(r36860);
        double r36862 = r36859 * r36861;
        double r36863 = phi1;
        double r36864 = cos(r36863);
        double r36865 = sin(r36860);
        double r36866 = r36864 * r36865;
        double r36867 = sin(r36863);
        double r36868 = r36855 * r36853;
        double r36869 = r36851 * r36857;
        double r36870 = r36868 - r36869;
        double r36871 = r36861 * r36870;
        double r36872 = r36867 * r36871;
        double r36873 = r36866 - r36872;
        double r36874 = atan2(r36862, r36873);
        return r36874;
}

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 r36875, r36876, r36877, r36878, r36879, r36880, r36881, r36882, r36883, r36884, r36885, r36886, r36887, r36888, r36889, r36890, r36891;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36875);
        mpfr_init(r36876);
        mpfr_init(r36877);
        mpfr_init(r36878);
        mpfr_init(r36879);
        mpfr_init(r36880);
        mpfr_init(r36881);
        mpfr_init(r36882);
        mpfr_init(r36883);
        mpfr_init(r36884);
        mpfr_init(r36885);
        mpfr_init(r36886);
        mpfr_init(r36887);
        mpfr_init(r36888);
        mpfr_init(r36889);
        mpfr_init(r36890);
        mpfr_init(r36891);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36875, lambda1, MPFR_RNDN);
        mpfr_set_d(r36876, lambda2, MPFR_RNDN);
        mpfr_sub(r36877, r36875, r36876, MPFR_RNDN);
        mpfr_sin(r36878, r36877, MPFR_RNDN);
        mpfr_set_d(r36879, phi2, MPFR_RNDN);
        mpfr_cos(r36880, r36879, MPFR_RNDN);
        mpfr_mul(r36881, r36878, r36880, MPFR_RNDN);
        mpfr_set_d(r36882, phi1, MPFR_RNDN);
        mpfr_cos(r36883, r36882, MPFR_RNDN);
        mpfr_sin(r36884, r36879, MPFR_RNDN);
        mpfr_mul(r36885, r36883, r36884, MPFR_RNDN);
        mpfr_sin(r36886, r36882, MPFR_RNDN);
        mpfr_mul(r36887, r36886, r36880, MPFR_RNDN);
        mpfr_cos(r36888, r36877, MPFR_RNDN);
        mpfr_mul(r36889, r36887, r36888, MPFR_RNDN);
        mpfr_sub(r36890, r36885, r36889, MPFR_RNDN);
        mpfr_atan2(r36891, r36881, r36890, MPFR_RNDN);
        return mpfr_get_d(r36891, MPFR_RNDN);
}

static mpfr_t r36892, r36893, r36894, r36895, r36896, r36897, r36898, r36899, r36900, r36901, r36902, r36903, r36904, r36905, r36906, r36907, r36908, r36909, r36910, r36911, r36912, r36913, r36914, r36915, r36916;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36892);
        mpfr_init(r36893);
        mpfr_init(r36894);
        mpfr_init(r36895);
        mpfr_init(r36896);
        mpfr_init(r36897);
        mpfr_init(r36898);
        mpfr_init(r36899);
        mpfr_init(r36900);
        mpfr_init(r36901);
        mpfr_init(r36902);
        mpfr_init(r36903);
        mpfr_init(r36904);
        mpfr_init(r36905);
        mpfr_init(r36906);
        mpfr_init(r36907);
        mpfr_init(r36908);
        mpfr_init(r36909);
        mpfr_init(r36910);
        mpfr_init(r36911);
        mpfr_init(r36912);
        mpfr_init(r36913);
        mpfr_init(r36914);
        mpfr_init(r36915);
        mpfr_init(r36916);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36892, lambda1, MPFR_RNDN);
        mpfr_sin(r36893, r36892, MPFR_RNDN);
        mpfr_set_d(r36894, lambda2, MPFR_RNDN);
        mpfr_cos(r36895, r36894, MPFR_RNDN);
        mpfr_mul(r36896, r36893, r36895, MPFR_RNDN);
        mpfr_cos(r36897, r36892, MPFR_RNDN);
        mpfr_neg(r36898, r36894, MPFR_RNDN);
        mpfr_sin(r36899, r36898, MPFR_RNDN);
        mpfr_mul(r36900, r36897, r36899, MPFR_RNDN);
        mpfr_add(r36901, r36896, r36900, MPFR_RNDN);
        mpfr_set_d(r36902, phi2, MPFR_RNDN);
        mpfr_cos(r36903, r36902, MPFR_RNDN);
        mpfr_mul(r36904, r36901, r36903, MPFR_RNDN);
        mpfr_set_d(r36905, phi1, MPFR_RNDN);
        mpfr_cos(r36906, r36905, MPFR_RNDN);
        mpfr_sin(r36907, r36902, MPFR_RNDN);
        mpfr_mul(r36908, r36906, r36907, MPFR_RNDN);
        mpfr_sin(r36909, r36905, MPFR_RNDN);
        mpfr_mul(r36910, r36897, r36895, MPFR_RNDN);
        mpfr_mul(r36911, r36893, r36899, MPFR_RNDN);
        mpfr_sub(r36912, r36910, r36911, MPFR_RNDN);
        mpfr_mul(r36913, r36903, r36912, MPFR_RNDN);
        mpfr_mul(r36914, r36909, r36913, MPFR_RNDN);
        mpfr_sub(r36915, r36908, r36914, MPFR_RNDN);
        mpfr_atan2(r36916, r36904, r36915, MPFR_RNDN);
        return mpfr_get_d(r36916, MPFR_RNDN);
}

static mpfr_t r36917, r36918, r36919, r36920, r36921, r36922, r36923, r36924, r36925, r36926, r36927, r36928, r36929, r36930, r36931, r36932, r36933, r36934, r36935, r36936, r36937, r36938, r36939, r36940, r36941;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36917);
        mpfr_init(r36918);
        mpfr_init(r36919);
        mpfr_init(r36920);
        mpfr_init(r36921);
        mpfr_init(r36922);
        mpfr_init(r36923);
        mpfr_init(r36924);
        mpfr_init(r36925);
        mpfr_init(r36926);
        mpfr_init(r36927);
        mpfr_init(r36928);
        mpfr_init(r36929);
        mpfr_init(r36930);
        mpfr_init(r36931);
        mpfr_init(r36932);
        mpfr_init(r36933);
        mpfr_init(r36934);
        mpfr_init(r36935);
        mpfr_init(r36936);
        mpfr_init(r36937);
        mpfr_init(r36938);
        mpfr_init(r36939);
        mpfr_init(r36940);
        mpfr_init(r36941);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36917, lambda1, MPFR_RNDN);
        mpfr_sin(r36918, r36917, MPFR_RNDN);
        mpfr_set_d(r36919, lambda2, MPFR_RNDN);
        mpfr_cos(r36920, r36919, MPFR_RNDN);
        mpfr_mul(r36921, r36918, r36920, MPFR_RNDN);
        mpfr_cos(r36922, r36917, MPFR_RNDN);
        mpfr_neg(r36923, r36919, MPFR_RNDN);
        mpfr_sin(r36924, r36923, MPFR_RNDN);
        mpfr_mul(r36925, r36922, r36924, MPFR_RNDN);
        mpfr_add(r36926, r36921, r36925, MPFR_RNDN);
        mpfr_set_d(r36927, phi2, MPFR_RNDN);
        mpfr_cos(r36928, r36927, MPFR_RNDN);
        mpfr_mul(r36929, r36926, r36928, MPFR_RNDN);
        mpfr_set_d(r36930, phi1, MPFR_RNDN);
        mpfr_cos(r36931, r36930, MPFR_RNDN);
        mpfr_sin(r36932, r36927, MPFR_RNDN);
        mpfr_mul(r36933, r36931, r36932, MPFR_RNDN);
        mpfr_sin(r36934, r36930, MPFR_RNDN);
        mpfr_mul(r36935, r36922, r36920, MPFR_RNDN);
        mpfr_mul(r36936, r36918, r36924, MPFR_RNDN);
        mpfr_sub(r36937, r36935, r36936, MPFR_RNDN);
        mpfr_mul(r36938, r36928, r36937, MPFR_RNDN);
        mpfr_mul(r36939, r36934, r36938, MPFR_RNDN);
        mpfr_sub(r36940, r36933, r36939, MPFR_RNDN);
        mpfr_atan2(r36941, r36929, r36940, MPFR_RNDN);
        return mpfr_get_d(r36941, MPFR_RNDN);
}

