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

char *name = "Destination given bearing on a great circle";

double f_if(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r18361808 = lambda1;
        float r18361809 = theta;
        float r18361810 = sin(r18361809);
        float r18361811 = delta;
        float r18361812 = sin(r18361811);
        float r18361813 = r18361810 * r18361812;
        float r18361814 = phi1;
        float r18361815 = cos(r18361814);
        float r18361816 = r18361813 * r18361815;
        float r18361817 = cos(r18361811);
        float r18361818 = sin(r18361814);
        float r18361819 = r18361818 * r18361817;
        float r18361820 = r18361815 * r18361812;
        float r18361821 = cos(r18361809);
        float r18361822 = r18361820 * r18361821;
        float r18361823 = r18361819 + r18361822;
        float r18361824 = asin(r18361823);
        float r18361825 = sin(r18361824);
        float r18361826 = r18361818 * r18361825;
        float r18361827 = r18361817 - r18361826;
        float r18361828 = atan2(r18361816, r18361827);
        float r18361829 = r18361808 + r18361828;
        return r18361829;
}

double f_id(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r18361830 = lambda1;
        double r18361831 = theta;
        double r18361832 = sin(r18361831);
        double r18361833 = delta;
        double r18361834 = sin(r18361833);
        double r18361835 = r18361832 * r18361834;
        double r18361836 = phi1;
        double r18361837 = cos(r18361836);
        double r18361838 = r18361835 * r18361837;
        double r18361839 = cos(r18361833);
        double r18361840 = sin(r18361836);
        double r18361841 = r18361840 * r18361839;
        double r18361842 = r18361837 * r18361834;
        double r18361843 = cos(r18361831);
        double r18361844 = r18361842 * r18361843;
        double r18361845 = r18361841 + r18361844;
        double r18361846 = asin(r18361845);
        double r18361847 = sin(r18361846);
        double r18361848 = r18361840 * r18361847;
        double r18361849 = r18361839 - r18361848;
        double r18361850 = atan2(r18361838, r18361849);
        double r18361851 = r18361830 + r18361850;
        return r18361851;
}


double f_of(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r18361852 = lambda1;
        float r18361853 = theta;
        float r18361854 = sin(r18361853);
        float r18361855 = delta;
        float r18361856 = sin(r18361855);
        float r18361857 = r18361854 * r18361856;
        float r18361858 = phi1;
        float r18361859 = cos(r18361858);
        float r18361860 = r18361857 * r18361859;
        float r18361861 = cos(r18361855);
        float r18361862 = 3;
        float r18361863 = pow(r18361861, r18361862);
        float r18361864 = sin(r18361858);
        float r18361865 = r18361864 * r18361861;
        float r18361866 = r18361859 * r18361856;
        float r18361867 = cos(r18361853);
        float r18361868 = r18361866 * r18361867;
        float r18361869 = r18361865 + r18361868;
        float r18361870 = asin(r18361869);
        float r18361871 = sin(r18361870);
        float r18361872 = r18361864 * r18361871;
        float r18361873 = pow(r18361872, r18361862);
        float r18361874 = r18361863 - r18361873;
        float r18361875 = r18361861 * r18361861;
        float r18361876 = r18361872 * r18361872;
        float r18361877 = cbrt(r18361869);
        float r18361878 = r18361877 * r18361877;
        float r18361879 = cbrt(r18361878);
        float r18361880 = cbrt(r18361877);
        float r18361881 = r18361879 * r18361880;
        float r18361882 = r18361878 * r18361881;
        float r18361883 = asin(r18361882);
        float r18361884 = sin(r18361883);
        float r18361885 = r18361864 * r18361884;
        float r18361886 = r18361861 * r18361885;
        float r18361887 = r18361876 + r18361886;
        float r18361888 = r18361875 + r18361887;
        float r18361889 = r18361874 / r18361888;
        float r18361890 = atan2(r18361860, r18361889);
        float r18361891 = r18361852 + r18361890;
        return r18361891;
}

double f_od(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r18361892 = lambda1;
        double r18361893 = theta;
        double r18361894 = sin(r18361893);
        double r18361895 = delta;
        double r18361896 = sin(r18361895);
        double r18361897 = r18361894 * r18361896;
        double r18361898 = phi1;
        double r18361899 = cos(r18361898);
        double r18361900 = r18361897 * r18361899;
        double r18361901 = cos(r18361895);
        double r18361902 = 3;
        double r18361903 = pow(r18361901, r18361902);
        double r18361904 = sin(r18361898);
        double r18361905 = r18361904 * r18361901;
        double r18361906 = r18361899 * r18361896;
        double r18361907 = cos(r18361893);
        double r18361908 = r18361906 * r18361907;
        double r18361909 = r18361905 + r18361908;
        double r18361910 = asin(r18361909);
        double r18361911 = sin(r18361910);
        double r18361912 = r18361904 * r18361911;
        double r18361913 = pow(r18361912, r18361902);
        double r18361914 = r18361903 - r18361913;
        double r18361915 = r18361901 * r18361901;
        double r18361916 = r18361912 * r18361912;
        double r18361917 = cbrt(r18361909);
        double r18361918 = r18361917 * r18361917;
        double r18361919 = cbrt(r18361918);
        double r18361920 = cbrt(r18361917);
        double r18361921 = r18361919 * r18361920;
        double r18361922 = r18361918 * r18361921;
        double r18361923 = asin(r18361922);
        double r18361924 = sin(r18361923);
        double r18361925 = r18361904 * r18361924;
        double r18361926 = r18361901 * r18361925;
        double r18361927 = r18361916 + r18361926;
        double r18361928 = r18361915 + r18361927;
        double r18361929 = r18361914 / r18361928;
        double r18361930 = atan2(r18361900, r18361929);
        double r18361931 = r18361892 + r18361930;
        return r18361931;
}

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 r18361932, r18361933, r18361934, r18361935, r18361936, r18361937, r18361938, r18361939, r18361940, r18361941, r18361942, r18361943, r18361944, r18361945, r18361946, r18361947, r18361948, r18361949, r18361950, r18361951, r18361952, r18361953;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r18361932);
        mpfr_init(r18361933);
        mpfr_init(r18361934);
        mpfr_init(r18361935);
        mpfr_init(r18361936);
        mpfr_init(r18361937);
        mpfr_init(r18361938);
        mpfr_init(r18361939);
        mpfr_init(r18361940);
        mpfr_init(r18361941);
        mpfr_init(r18361942);
        mpfr_init(r18361943);
        mpfr_init(r18361944);
        mpfr_init(r18361945);
        mpfr_init(r18361946);
        mpfr_init(r18361947);
        mpfr_init(r18361948);
        mpfr_init(r18361949);
        mpfr_init(r18361950);
        mpfr_init(r18361951);
        mpfr_init(r18361952);
        mpfr_init(r18361953);
}

double f_im(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r18361932, lambda1, MPFR_RNDN);
        mpfr_set_d(r18361933, theta, MPFR_RNDN);
        mpfr_sin(r18361934, r18361933, MPFR_RNDN);
        mpfr_set_d(r18361935, delta, MPFR_RNDN);
        mpfr_sin(r18361936, r18361935, MPFR_RNDN);
        mpfr_mul(r18361937, r18361934, r18361936, MPFR_RNDN);
        mpfr_set_d(r18361938, phi1, MPFR_RNDN);
        mpfr_cos(r18361939, r18361938, MPFR_RNDN);
        mpfr_mul(r18361940, r18361937, r18361939, MPFR_RNDN);
        mpfr_cos(r18361941, r18361935, MPFR_RNDN);
        mpfr_sin(r18361942, r18361938, MPFR_RNDN);
        mpfr_mul(r18361943, r18361942, r18361941, MPFR_RNDN);
        mpfr_mul(r18361944, r18361939, r18361936, MPFR_RNDN);
        mpfr_cos(r18361945, r18361933, MPFR_RNDN);
        mpfr_mul(r18361946, r18361944, r18361945, MPFR_RNDN);
        mpfr_add(r18361947, r18361943, r18361946, MPFR_RNDN);
        mpfr_asin(r18361948, r18361947, MPFR_RNDN);
        mpfr_sin(r18361949, r18361948, MPFR_RNDN);
        mpfr_mul(r18361950, r18361942, r18361949, MPFR_RNDN);
        mpfr_sub(r18361951, r18361941, r18361950, MPFR_RNDN);
        mpfr_atan2(r18361952, r18361940, r18361951, MPFR_RNDN);
        mpfr_add(r18361953, r18361932, r18361952, MPFR_RNDN);
        return mpfr_get_d(r18361953, MPFR_RNDN);
}

static mpfr_t r18361954, r18361955, r18361956, r18361957, r18361958, r18361959, r18361960, r18361961, r18361962, r18361963, r18361964, r18361965, r18361966, r18361967, r18361968, r18361969, r18361970, r18361971, r18361972, r18361973, r18361974, r18361975, r18361976, r18361977, r18361978, r18361979, r18361980, r18361981, r18361982, r18361983, r18361984, r18361985, r18361986, r18361987, r18361988, r18361989, r18361990, r18361991, r18361992, r18361993;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r18361954);
        mpfr_init(r18361955);
        mpfr_init(r18361956);
        mpfr_init(r18361957);
        mpfr_init(r18361958);
        mpfr_init(r18361959);
        mpfr_init(r18361960);
        mpfr_init(r18361961);
        mpfr_init(r18361962);
        mpfr_init(r18361963);
        mpfr_init_set_str(r18361964, "3", 10, MPFR_RNDN);
        mpfr_init(r18361965);
        mpfr_init(r18361966);
        mpfr_init(r18361967);
        mpfr_init(r18361968);
        mpfr_init(r18361969);
        mpfr_init(r18361970);
        mpfr_init(r18361971);
        mpfr_init(r18361972);
        mpfr_init(r18361973);
        mpfr_init(r18361974);
        mpfr_init(r18361975);
        mpfr_init(r18361976);
        mpfr_init(r18361977);
        mpfr_init(r18361978);
        mpfr_init(r18361979);
        mpfr_init(r18361980);
        mpfr_init(r18361981);
        mpfr_init(r18361982);
        mpfr_init(r18361983);
        mpfr_init(r18361984);
        mpfr_init(r18361985);
        mpfr_init(r18361986);
        mpfr_init(r18361987);
        mpfr_init(r18361988);
        mpfr_init(r18361989);
        mpfr_init(r18361990);
        mpfr_init(r18361991);
        mpfr_init(r18361992);
        mpfr_init(r18361993);
}

double f_fm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r18361954, lambda1, MPFR_RNDN);
        mpfr_set_d(r18361955, theta, MPFR_RNDN);
        mpfr_sin(r18361956, r18361955, MPFR_RNDN);
        mpfr_set_d(r18361957, delta, MPFR_RNDN);
        mpfr_sin(r18361958, r18361957, MPFR_RNDN);
        mpfr_mul(r18361959, r18361956, r18361958, MPFR_RNDN);
        mpfr_set_d(r18361960, phi1, MPFR_RNDN);
        mpfr_cos(r18361961, r18361960, MPFR_RNDN);
        mpfr_mul(r18361962, r18361959, r18361961, MPFR_RNDN);
        mpfr_cos(r18361963, r18361957, MPFR_RNDN);
        ;
        mpfr_pow(r18361965, r18361963, r18361964, MPFR_RNDN);
        mpfr_sin(r18361966, r18361960, MPFR_RNDN);
        mpfr_mul(r18361967, r18361966, r18361963, MPFR_RNDN);
        mpfr_mul(r18361968, r18361961, r18361958, MPFR_RNDN);
        mpfr_cos(r18361969, r18361955, MPFR_RNDN);
        mpfr_mul(r18361970, r18361968, r18361969, MPFR_RNDN);
        mpfr_add(r18361971, r18361967, r18361970, MPFR_RNDN);
        mpfr_asin(r18361972, r18361971, MPFR_RNDN);
        mpfr_sin(r18361973, r18361972, MPFR_RNDN);
        mpfr_mul(r18361974, r18361966, r18361973, MPFR_RNDN);
        mpfr_pow(r18361975, r18361974, r18361964, MPFR_RNDN);
        mpfr_sub(r18361976, r18361965, r18361975, MPFR_RNDN);
        mpfr_mul(r18361977, r18361963, r18361963, MPFR_RNDN);
        mpfr_mul(r18361978, r18361974, r18361974, MPFR_RNDN);
        mpfr_cbrt(r18361979, r18361971, MPFR_RNDN);
        mpfr_mul(r18361980, r18361979, r18361979, MPFR_RNDN);
        mpfr_cbrt(r18361981, r18361980, MPFR_RNDN);
        mpfr_cbrt(r18361982, r18361979, MPFR_RNDN);
        mpfr_mul(r18361983, r18361981, r18361982, MPFR_RNDN);
        mpfr_mul(r18361984, r18361980, r18361983, MPFR_RNDN);
        mpfr_asin(r18361985, r18361984, MPFR_RNDN);
        mpfr_sin(r18361986, r18361985, MPFR_RNDN);
        mpfr_mul(r18361987, r18361966, r18361986, MPFR_RNDN);
        mpfr_mul(r18361988, r18361963, r18361987, MPFR_RNDN);
        mpfr_add(r18361989, r18361978, r18361988, MPFR_RNDN);
        mpfr_add(r18361990, r18361977, r18361989, MPFR_RNDN);
        mpfr_div(r18361991, r18361976, r18361990, MPFR_RNDN);
        mpfr_atan2(r18361992, r18361962, r18361991, MPFR_RNDN);
        mpfr_add(r18361993, r18361954, r18361992, MPFR_RNDN);
        return mpfr_get_d(r18361993, MPFR_RNDN);
}

static mpfr_t r18361994, r18361995, r18361996, r18361997, r18361998, r18361999, r18362000, r18362001, r18362002, r18362003, r18362004, r18362005, r18362006, r18362007, r18362008, r18362009, r18362010, r18362011, r18362012, r18362013, r18362014, r18362015, r18362016, r18362017, r18362018, r18362019, r18362020, r18362021, r18362022, r18362023, r18362024, r18362025, r18362026, r18362027, r18362028, r18362029, r18362030, r18362031, r18362032, r18362033;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r18361994);
        mpfr_init(r18361995);
        mpfr_init(r18361996);
        mpfr_init(r18361997);
        mpfr_init(r18361998);
        mpfr_init(r18361999);
        mpfr_init(r18362000);
        mpfr_init(r18362001);
        mpfr_init(r18362002);
        mpfr_init(r18362003);
        mpfr_init_set_str(r18362004, "3", 10, MPFR_RNDN);
        mpfr_init(r18362005);
        mpfr_init(r18362006);
        mpfr_init(r18362007);
        mpfr_init(r18362008);
        mpfr_init(r18362009);
        mpfr_init(r18362010);
        mpfr_init(r18362011);
        mpfr_init(r18362012);
        mpfr_init(r18362013);
        mpfr_init(r18362014);
        mpfr_init(r18362015);
        mpfr_init(r18362016);
        mpfr_init(r18362017);
        mpfr_init(r18362018);
        mpfr_init(r18362019);
        mpfr_init(r18362020);
        mpfr_init(r18362021);
        mpfr_init(r18362022);
        mpfr_init(r18362023);
        mpfr_init(r18362024);
        mpfr_init(r18362025);
        mpfr_init(r18362026);
        mpfr_init(r18362027);
        mpfr_init(r18362028);
        mpfr_init(r18362029);
        mpfr_init(r18362030);
        mpfr_init(r18362031);
        mpfr_init(r18362032);
        mpfr_init(r18362033);
}

double f_dm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r18361994, lambda1, MPFR_RNDN);
        mpfr_set_d(r18361995, theta, MPFR_RNDN);
        mpfr_sin(r18361996, r18361995, MPFR_RNDN);
        mpfr_set_d(r18361997, delta, MPFR_RNDN);
        mpfr_sin(r18361998, r18361997, MPFR_RNDN);
        mpfr_mul(r18361999, r18361996, r18361998, MPFR_RNDN);
        mpfr_set_d(r18362000, phi1, MPFR_RNDN);
        mpfr_cos(r18362001, r18362000, MPFR_RNDN);
        mpfr_mul(r18362002, r18361999, r18362001, MPFR_RNDN);
        mpfr_cos(r18362003, r18361997, MPFR_RNDN);
        ;
        mpfr_pow(r18362005, r18362003, r18362004, MPFR_RNDN);
        mpfr_sin(r18362006, r18362000, MPFR_RNDN);
        mpfr_mul(r18362007, r18362006, r18362003, MPFR_RNDN);
        mpfr_mul(r18362008, r18362001, r18361998, MPFR_RNDN);
        mpfr_cos(r18362009, r18361995, MPFR_RNDN);
        mpfr_mul(r18362010, r18362008, r18362009, MPFR_RNDN);
        mpfr_add(r18362011, r18362007, r18362010, MPFR_RNDN);
        mpfr_asin(r18362012, r18362011, MPFR_RNDN);
        mpfr_sin(r18362013, r18362012, MPFR_RNDN);
        mpfr_mul(r18362014, r18362006, r18362013, MPFR_RNDN);
        mpfr_pow(r18362015, r18362014, r18362004, MPFR_RNDN);
        mpfr_sub(r18362016, r18362005, r18362015, MPFR_RNDN);
        mpfr_mul(r18362017, r18362003, r18362003, MPFR_RNDN);
        mpfr_mul(r18362018, r18362014, r18362014, MPFR_RNDN);
        mpfr_cbrt(r18362019, r18362011, MPFR_RNDN);
        mpfr_mul(r18362020, r18362019, r18362019, MPFR_RNDN);
        mpfr_cbrt(r18362021, r18362020, MPFR_RNDN);
        mpfr_cbrt(r18362022, r18362019, MPFR_RNDN);
        mpfr_mul(r18362023, r18362021, r18362022, MPFR_RNDN);
        mpfr_mul(r18362024, r18362020, r18362023, MPFR_RNDN);
        mpfr_asin(r18362025, r18362024, MPFR_RNDN);
        mpfr_sin(r18362026, r18362025, MPFR_RNDN);
        mpfr_mul(r18362027, r18362006, r18362026, MPFR_RNDN);
        mpfr_mul(r18362028, r18362003, r18362027, MPFR_RNDN);
        mpfr_add(r18362029, r18362018, r18362028, MPFR_RNDN);
        mpfr_add(r18362030, r18362017, r18362029, MPFR_RNDN);
        mpfr_div(r18362031, r18362016, r18362030, MPFR_RNDN);
        mpfr_atan2(r18362032, r18362002, r18362031, MPFR_RNDN);
        mpfr_add(r18362033, r18361994, r18362032, MPFR_RNDN);
        return mpfr_get_d(r18362033, MPFR_RNDN);
}

