#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 r34904 = lambda1;
        float r34905 = theta;
        float r34906 = sin(r34905);
        float r34907 = delta;
        float r34908 = sin(r34907);
        float r34909 = r34906 * r34908;
        float r34910 = phi1;
        float r34911 = cos(r34910);
        float r34912 = r34909 * r34911;
        float r34913 = cos(r34907);
        float r34914 = sin(r34910);
        float r34915 = r34914 * r34913;
        float r34916 = r34911 * r34908;
        float r34917 = cos(r34905);
        float r34918 = r34916 * r34917;
        float r34919 = r34915 + r34918;
        float r34920 = asin(r34919);
        float r34921 = sin(r34920);
        float r34922 = r34914 * r34921;
        float r34923 = r34913 - r34922;
        float r34924 = atan2(r34912, r34923);
        float r34925 = r34904 + r34924;
        return r34925;
}

double f_id(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r34926 = lambda1;
        double r34927 = theta;
        double r34928 = sin(r34927);
        double r34929 = delta;
        double r34930 = sin(r34929);
        double r34931 = r34928 * r34930;
        double r34932 = phi1;
        double r34933 = cos(r34932);
        double r34934 = r34931 * r34933;
        double r34935 = cos(r34929);
        double r34936 = sin(r34932);
        double r34937 = r34936 * r34935;
        double r34938 = r34933 * r34930;
        double r34939 = cos(r34927);
        double r34940 = r34938 * r34939;
        double r34941 = r34937 + r34940;
        double r34942 = asin(r34941);
        double r34943 = sin(r34942);
        double r34944 = r34936 * r34943;
        double r34945 = r34935 - r34944;
        double r34946 = atan2(r34934, r34945);
        double r34947 = r34926 + r34946;
        return r34947;
}


double f_of(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r34948 = lambda1;
        float r34949 = theta;
        float r34950 = sin(r34949);
        float r34951 = delta;
        float r34952 = sin(r34951);
        float r34953 = r34950 * r34952;
        float r34954 = phi1;
        float r34955 = cos(r34954);
        float r34956 = r34953 * r34955;
        float r34957 = cos(r34951);
        float r34958 = sin(r34954);
        float r34959 = r34957 * r34958;
        float r34960 = cos(r34949);
        float r34961 = r34952 * r34960;
        float r34962 = r34961 * r34955;
        float r34963 = r34959 + r34962;
        float r34964 = asin(r34963);
        float r34965 = sin(r34964);
        float r34966 = r34965 * r34958;
        float r34967 = 3;
        float r34968 = pow(r34966, r34967);
        float r34969 = cbrt(r34968);
        float r34970 = r34957 - r34969;
        float r34971 = atan2(r34956, r34970);
        float r34972 = r34948 + r34971;
        return r34972;
}

double f_od(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r34973 = lambda1;
        double r34974 = theta;
        double r34975 = sin(r34974);
        double r34976 = delta;
        double r34977 = sin(r34976);
        double r34978 = r34975 * r34977;
        double r34979 = phi1;
        double r34980 = cos(r34979);
        double r34981 = r34978 * r34980;
        double r34982 = cos(r34976);
        double r34983 = sin(r34979);
        double r34984 = r34982 * r34983;
        double r34985 = cos(r34974);
        double r34986 = r34977 * r34985;
        double r34987 = r34986 * r34980;
        double r34988 = r34984 + r34987;
        double r34989 = asin(r34988);
        double r34990 = sin(r34989);
        double r34991 = r34990 * r34983;
        double r34992 = 3;
        double r34993 = pow(r34991, r34992);
        double r34994 = cbrt(r34993);
        double r34995 = r34982 - r34994;
        double r34996 = atan2(r34981, r34995);
        double r34997 = r34973 + r34996;
        return r34997;
}

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 r34998, r34999, r35000, r35001, r35002, r35003, r35004, r35005, r35006, r35007, r35008, r35009, r35010, r35011, r35012, r35013, r35014, r35015, r35016, r35017, r35018, r35019;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r34998);
        mpfr_init(r34999);
        mpfr_init(r35000);
        mpfr_init(r35001);
        mpfr_init(r35002);
        mpfr_init(r35003);
        mpfr_init(r35004);
        mpfr_init(r35005);
        mpfr_init(r35006);
        mpfr_init(r35007);
        mpfr_init(r35008);
        mpfr_init(r35009);
        mpfr_init(r35010);
        mpfr_init(r35011);
        mpfr_init(r35012);
        mpfr_init(r35013);
        mpfr_init(r35014);
        mpfr_init(r35015);
        mpfr_init(r35016);
        mpfr_init(r35017);
        mpfr_init(r35018);
        mpfr_init(r35019);
}

double f_im(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r34998, lambda1, MPFR_RNDN);
        mpfr_set_d(r34999, theta, MPFR_RNDN);
        mpfr_sin(r35000, r34999, MPFR_RNDN);
        mpfr_set_d(r35001, delta, MPFR_RNDN);
        mpfr_sin(r35002, r35001, MPFR_RNDN);
        mpfr_mul(r35003, r35000, r35002, MPFR_RNDN);
        mpfr_set_d(r35004, phi1, MPFR_RNDN);
        mpfr_cos(r35005, r35004, MPFR_RNDN);
        mpfr_mul(r35006, r35003, r35005, MPFR_RNDN);
        mpfr_cos(r35007, r35001, MPFR_RNDN);
        mpfr_sin(r35008, r35004, MPFR_RNDN);
        mpfr_mul(r35009, r35008, r35007, MPFR_RNDN);
        mpfr_mul(r35010, r35005, r35002, MPFR_RNDN);
        mpfr_cos(r35011, r34999, MPFR_RNDN);
        mpfr_mul(r35012, r35010, r35011, MPFR_RNDN);
        mpfr_add(r35013, r35009, r35012, MPFR_RNDN);
        mpfr_asin(r35014, r35013, MPFR_RNDN);
        mpfr_sin(r35015, r35014, MPFR_RNDN);
        mpfr_mul(r35016, r35008, r35015, MPFR_RNDN);
        mpfr_sub(r35017, r35007, r35016, MPFR_RNDN);
        mpfr_atan2(r35018, r35006, r35017, MPFR_RNDN);
        mpfr_add(r35019, r34998, r35018, MPFR_RNDN);
        return mpfr_get_d(r35019, MPFR_RNDN);
}

static mpfr_t r35020, r35021, r35022, r35023, r35024, r35025, r35026, r35027, r35028, r35029, r35030, r35031, r35032, r35033, r35034, r35035, r35036, r35037, r35038, r35039, r35040, r35041, r35042, r35043, r35044;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r35020);
        mpfr_init(r35021);
        mpfr_init(r35022);
        mpfr_init(r35023);
        mpfr_init(r35024);
        mpfr_init(r35025);
        mpfr_init(r35026);
        mpfr_init(r35027);
        mpfr_init(r35028);
        mpfr_init(r35029);
        mpfr_init(r35030);
        mpfr_init(r35031);
        mpfr_init(r35032);
        mpfr_init(r35033);
        mpfr_init(r35034);
        mpfr_init(r35035);
        mpfr_init(r35036);
        mpfr_init(r35037);
        mpfr_init(r35038);
        mpfr_init_set_str(r35039, "3", 10, MPFR_RNDN);
        mpfr_init(r35040);
        mpfr_init(r35041);
        mpfr_init(r35042);
        mpfr_init(r35043);
        mpfr_init(r35044);
}

double f_fm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r35020, lambda1, MPFR_RNDN);
        mpfr_set_d(r35021, theta, MPFR_RNDN);
        mpfr_sin(r35022, r35021, MPFR_RNDN);
        mpfr_set_d(r35023, delta, MPFR_RNDN);
        mpfr_sin(r35024, r35023, MPFR_RNDN);
        mpfr_mul(r35025, r35022, r35024, MPFR_RNDN);
        mpfr_set_d(r35026, phi1, MPFR_RNDN);
        mpfr_cos(r35027, r35026, MPFR_RNDN);
        mpfr_mul(r35028, r35025, r35027, MPFR_RNDN);
        mpfr_cos(r35029, r35023, MPFR_RNDN);
        mpfr_sin(r35030, r35026, MPFR_RNDN);
        mpfr_mul(r35031, r35029, r35030, MPFR_RNDN);
        mpfr_cos(r35032, r35021, MPFR_RNDN);
        mpfr_mul(r35033, r35024, r35032, MPFR_RNDN);
        mpfr_mul(r35034, r35033, r35027, MPFR_RNDN);
        mpfr_add(r35035, r35031, r35034, MPFR_RNDN);
        mpfr_asin(r35036, r35035, MPFR_RNDN);
        mpfr_sin(r35037, r35036, MPFR_RNDN);
        mpfr_mul(r35038, r35037, r35030, MPFR_RNDN);
        ;
        mpfr_pow(r35040, r35038, r35039, MPFR_RNDN);
        mpfr_cbrt(r35041, r35040, MPFR_RNDN);
        mpfr_sub(r35042, r35029, r35041, MPFR_RNDN);
        mpfr_atan2(r35043, r35028, r35042, MPFR_RNDN);
        mpfr_add(r35044, r35020, r35043, MPFR_RNDN);
        return mpfr_get_d(r35044, MPFR_RNDN);
}

static mpfr_t r35045, r35046, r35047, r35048, r35049, r35050, r35051, r35052, r35053, r35054, r35055, r35056, r35057, r35058, r35059, r35060, r35061, r35062, r35063, r35064, r35065, r35066, r35067, r35068, r35069;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r35045);
        mpfr_init(r35046);
        mpfr_init(r35047);
        mpfr_init(r35048);
        mpfr_init(r35049);
        mpfr_init(r35050);
        mpfr_init(r35051);
        mpfr_init(r35052);
        mpfr_init(r35053);
        mpfr_init(r35054);
        mpfr_init(r35055);
        mpfr_init(r35056);
        mpfr_init(r35057);
        mpfr_init(r35058);
        mpfr_init(r35059);
        mpfr_init(r35060);
        mpfr_init(r35061);
        mpfr_init(r35062);
        mpfr_init(r35063);
        mpfr_init_set_str(r35064, "3", 10, MPFR_RNDN);
        mpfr_init(r35065);
        mpfr_init(r35066);
        mpfr_init(r35067);
        mpfr_init(r35068);
        mpfr_init(r35069);
}

double f_dm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r35045, lambda1, MPFR_RNDN);
        mpfr_set_d(r35046, theta, MPFR_RNDN);
        mpfr_sin(r35047, r35046, MPFR_RNDN);
        mpfr_set_d(r35048, delta, MPFR_RNDN);
        mpfr_sin(r35049, r35048, MPFR_RNDN);
        mpfr_mul(r35050, r35047, r35049, MPFR_RNDN);
        mpfr_set_d(r35051, phi1, MPFR_RNDN);
        mpfr_cos(r35052, r35051, MPFR_RNDN);
        mpfr_mul(r35053, r35050, r35052, MPFR_RNDN);
        mpfr_cos(r35054, r35048, MPFR_RNDN);
        mpfr_sin(r35055, r35051, MPFR_RNDN);
        mpfr_mul(r35056, r35054, r35055, MPFR_RNDN);
        mpfr_cos(r35057, r35046, MPFR_RNDN);
        mpfr_mul(r35058, r35049, r35057, MPFR_RNDN);
        mpfr_mul(r35059, r35058, r35052, MPFR_RNDN);
        mpfr_add(r35060, r35056, r35059, MPFR_RNDN);
        mpfr_asin(r35061, r35060, MPFR_RNDN);
        mpfr_sin(r35062, r35061, MPFR_RNDN);
        mpfr_mul(r35063, r35062, r35055, MPFR_RNDN);
        ;
        mpfr_pow(r35065, r35063, r35064, MPFR_RNDN);
        mpfr_cbrt(r35066, r35065, MPFR_RNDN);
        mpfr_sub(r35067, r35054, r35066, MPFR_RNDN);
        mpfr_atan2(r35068, r35053, r35067, MPFR_RNDN);
        mpfr_add(r35069, r35045, r35068, MPFR_RNDN);
        return mpfr_get_d(r35069, MPFR_RNDN);
}

