#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 r36803 = lambda1;
        float r36804 = lambda2;
        float r36805 = r36803 - r36804;
        float r36806 = sin(r36805);
        float r36807 = phi2;
        float r36808 = cos(r36807);
        float r36809 = r36806 * r36808;
        float r36810 = phi1;
        float r36811 = cos(r36810);
        float r36812 = sin(r36807);
        float r36813 = r36811 * r36812;
        float r36814 = sin(r36810);
        float r36815 = r36814 * r36808;
        float r36816 = cos(r36805);
        float r36817 = r36815 * r36816;
        float r36818 = r36813 - r36817;
        float r36819 = atan2(r36809, r36818);
        return r36819;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r36820 = lambda1;
        double r36821 = lambda2;
        double r36822 = r36820 - r36821;
        double r36823 = sin(r36822);
        double r36824 = phi2;
        double r36825 = cos(r36824);
        double r36826 = r36823 * r36825;
        double r36827 = phi1;
        double r36828 = cos(r36827);
        double r36829 = sin(r36824);
        double r36830 = r36828 * r36829;
        double r36831 = sin(r36827);
        double r36832 = r36831 * r36825;
        double r36833 = cos(r36822);
        double r36834 = r36832 * r36833;
        double r36835 = r36830 - r36834;
        double r36836 = atan2(r36826, r36835);
        return r36836;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r36837 = lambda1;
        float r36838 = sin(r36837);
        float r36839 = lambda2;
        float r36840 = cos(r36839);
        float r36841 = r36838 * r36840;
        float r36842 = cos(r36837);
        float r36843 = -r36839;
        float r36844 = sin(r36843);
        float r36845 = r36842 * r36844;
        float r36846 = r36841 + r36845;
        float r36847 = phi2;
        float r36848 = cos(r36847);
        float r36849 = r36846 * r36848;
        float r36850 = phi1;
        float r36851 = cos(r36850);
        float r36852 = sin(r36847);
        float r36853 = r36851 * r36852;
        float r36854 = sin(r36850);
        float r36855 = r36842 * r36840;
        float r36856 = r36838 * r36844;
        float r36857 = r36855 - r36856;
        float r36858 = r36848 * r36857;
        float r36859 = r36854 * r36858;
        float r36860 = r36853 - r36859;
        float r36861 = atan2(r36849, r36860);
        return r36861;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r36862 = lambda1;
        double r36863 = sin(r36862);
        double r36864 = lambda2;
        double r36865 = cos(r36864);
        double r36866 = r36863 * r36865;
        double r36867 = cos(r36862);
        double r36868 = -r36864;
        double r36869 = sin(r36868);
        double r36870 = r36867 * r36869;
        double r36871 = r36866 + r36870;
        double r36872 = phi2;
        double r36873 = cos(r36872);
        double r36874 = r36871 * r36873;
        double r36875 = phi1;
        double r36876 = cos(r36875);
        double r36877 = sin(r36872);
        double r36878 = r36876 * r36877;
        double r36879 = sin(r36875);
        double r36880 = r36867 * r36865;
        double r36881 = r36863 * r36869;
        double r36882 = r36880 - r36881;
        double r36883 = r36873 * r36882;
        double r36884 = r36879 * r36883;
        double r36885 = r36878 - r36884;
        double r36886 = atan2(r36874, r36885);
        return r36886;
}

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 r36887, r36888, r36889, r36890, r36891, r36892, r36893, r36894, r36895, r36896, r36897, r36898, r36899, r36900, r36901, r36902, r36903;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36887);
        mpfr_init(r36888);
        mpfr_init(r36889);
        mpfr_init(r36890);
        mpfr_init(r36891);
        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);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36887, lambda1, MPFR_RNDN);
        mpfr_set_d(r36888, lambda2, MPFR_RNDN);
        mpfr_sub(r36889, r36887, r36888, MPFR_RNDN);
        mpfr_sin(r36890, r36889, MPFR_RNDN);
        mpfr_set_d(r36891, phi2, MPFR_RNDN);
        mpfr_cos(r36892, r36891, MPFR_RNDN);
        mpfr_mul(r36893, r36890, r36892, MPFR_RNDN);
        mpfr_set_d(r36894, phi1, MPFR_RNDN);
        mpfr_cos(r36895, r36894, MPFR_RNDN);
        mpfr_sin(r36896, r36891, MPFR_RNDN);
        mpfr_mul(r36897, r36895, r36896, MPFR_RNDN);
        mpfr_sin(r36898, r36894, MPFR_RNDN);
        mpfr_mul(r36899, r36898, r36892, MPFR_RNDN);
        mpfr_cos(r36900, r36889, MPFR_RNDN);
        mpfr_mul(r36901, r36899, r36900, MPFR_RNDN);
        mpfr_sub(r36902, r36897, r36901, MPFR_RNDN);
        mpfr_atan2(r36903, r36893, r36902, MPFR_RNDN);
        return mpfr_get_d(r36903, MPFR_RNDN);
}

static mpfr_t r36904, r36905, r36906, r36907, r36908, r36909, r36910, r36911, r36912, r36913, r36914, r36915, r36916, r36917, r36918, r36919, r36920, r36921, r36922, r36923, r36924, r36925, r36926, r36927, r36928;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        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);
        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);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36904, lambda1, MPFR_RNDN);
        mpfr_sin(r36905, r36904, MPFR_RNDN);
        mpfr_set_d(r36906, lambda2, MPFR_RNDN);
        mpfr_cos(r36907, r36906, MPFR_RNDN);
        mpfr_mul(r36908, r36905, r36907, MPFR_RNDN);
        mpfr_cos(r36909, r36904, MPFR_RNDN);
        mpfr_neg(r36910, r36906, MPFR_RNDN);
        mpfr_sin(r36911, r36910, MPFR_RNDN);
        mpfr_mul(r36912, r36909, r36911, MPFR_RNDN);
        mpfr_add(r36913, r36908, r36912, MPFR_RNDN);
        mpfr_set_d(r36914, phi2, MPFR_RNDN);
        mpfr_cos(r36915, r36914, MPFR_RNDN);
        mpfr_mul(r36916, r36913, r36915, MPFR_RNDN);
        mpfr_set_d(r36917, phi1, MPFR_RNDN);
        mpfr_cos(r36918, r36917, MPFR_RNDN);
        mpfr_sin(r36919, r36914, MPFR_RNDN);
        mpfr_mul(r36920, r36918, r36919, MPFR_RNDN);
        mpfr_sin(r36921, r36917, MPFR_RNDN);
        mpfr_mul(r36922, r36909, r36907, MPFR_RNDN);
        mpfr_mul(r36923, r36905, r36911, MPFR_RNDN);
        mpfr_sub(r36924, r36922, r36923, MPFR_RNDN);
        mpfr_mul(r36925, r36915, r36924, MPFR_RNDN);
        mpfr_mul(r36926, r36921, r36925, MPFR_RNDN);
        mpfr_sub(r36927, r36920, r36926, MPFR_RNDN);
        mpfr_atan2(r36928, r36916, r36927, MPFR_RNDN);
        return mpfr_get_d(r36928, MPFR_RNDN);
}

static mpfr_t r36929, r36930, r36931, r36932, r36933, r36934, r36935, r36936, r36937, r36938, r36939, r36940, r36941, r36942, r36943, r36944, r36945, r36946, r36947, r36948, r36949, r36950, r36951, r36952, r36953;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        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);
        mpfr_init(r36942);
        mpfr_init(r36943);
        mpfr_init(r36944);
        mpfr_init(r36945);
        mpfr_init(r36946);
        mpfr_init(r36947);
        mpfr_init(r36948);
        mpfr_init(r36949);
        mpfr_init(r36950);
        mpfr_init(r36951);
        mpfr_init(r36952);
        mpfr_init(r36953);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36929, lambda1, MPFR_RNDN);
        mpfr_sin(r36930, r36929, MPFR_RNDN);
        mpfr_set_d(r36931, lambda2, MPFR_RNDN);
        mpfr_cos(r36932, r36931, MPFR_RNDN);
        mpfr_mul(r36933, r36930, r36932, MPFR_RNDN);
        mpfr_cos(r36934, r36929, MPFR_RNDN);
        mpfr_neg(r36935, r36931, MPFR_RNDN);
        mpfr_sin(r36936, r36935, MPFR_RNDN);
        mpfr_mul(r36937, r36934, r36936, MPFR_RNDN);
        mpfr_add(r36938, r36933, r36937, MPFR_RNDN);
        mpfr_set_d(r36939, phi2, MPFR_RNDN);
        mpfr_cos(r36940, r36939, MPFR_RNDN);
        mpfr_mul(r36941, r36938, r36940, MPFR_RNDN);
        mpfr_set_d(r36942, phi1, MPFR_RNDN);
        mpfr_cos(r36943, r36942, MPFR_RNDN);
        mpfr_sin(r36944, r36939, MPFR_RNDN);
        mpfr_mul(r36945, r36943, r36944, MPFR_RNDN);
        mpfr_sin(r36946, r36942, MPFR_RNDN);
        mpfr_mul(r36947, r36934, r36932, MPFR_RNDN);
        mpfr_mul(r36948, r36930, r36936, MPFR_RNDN);
        mpfr_sub(r36949, r36947, r36948, MPFR_RNDN);
        mpfr_mul(r36950, r36940, r36949, MPFR_RNDN);
        mpfr_mul(r36951, r36946, r36950, MPFR_RNDN);
        mpfr_sub(r36952, r36945, r36951, MPFR_RNDN);
        mpfr_atan2(r36953, r36941, r36952, MPFR_RNDN);
        return mpfr_get_d(r36953, MPFR_RNDN);
}

