#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 r20925 = lambda1;
        float r20926 = lambda2;
        float r20927 = r20925 - r20926;
        float r20928 = sin(r20927);
        float r20929 = phi2;
        float r20930 = cos(r20929);
        float r20931 = r20928 * r20930;
        float r20932 = phi1;
        float r20933 = cos(r20932);
        float r20934 = sin(r20929);
        float r20935 = r20933 * r20934;
        float r20936 = sin(r20932);
        float r20937 = r20936 * r20930;
        float r20938 = cos(r20927);
        float r20939 = r20937 * r20938;
        float r20940 = r20935 - r20939;
        float r20941 = atan2(r20931, r20940);
        return r20941;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r20942 = lambda1;
        double r20943 = lambda2;
        double r20944 = r20942 - r20943;
        double r20945 = sin(r20944);
        double r20946 = phi2;
        double r20947 = cos(r20946);
        double r20948 = r20945 * r20947;
        double r20949 = phi1;
        double r20950 = cos(r20949);
        double r20951 = sin(r20946);
        double r20952 = r20950 * r20951;
        double r20953 = sin(r20949);
        double r20954 = r20953 * r20947;
        double r20955 = cos(r20944);
        double r20956 = r20954 * r20955;
        double r20957 = r20952 - r20956;
        double r20958 = atan2(r20948, r20957);
        return r20958;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r20959 = lambda1;
        float r20960 = sin(r20959);
        float r20961 = lambda2;
        float r20962 = cos(r20961);
        float r20963 = r20960 * r20962;
        float r20964 = cos(r20959);
        float r20965 = -r20961;
        float r20966 = sin(r20965);
        float r20967 = r20964 * r20966;
        float r20968 = r20963 + r20967;
        float r20969 = phi2;
        float r20970 = cos(r20969);
        float r20971 = r20968 * r20970;
        float r20972 = phi1;
        float r20973 = cos(r20972);
        float r20974 = sin(r20969);
        float r20975 = r20973 * r20974;
        float r20976 = sin(r20972);
        float r20977 = r20976 * r20970;
        float r20978 = r20964 * r20962;
        float r20979 = r20977 * r20978;
        float r20980 = cbrt(r20960);
        float r20981 = r20980 * r20980;
        float r20982 = sin(r20961);
        float r20983 = r20980 * r20982;
        float r20984 = r20981 * r20983;
        float r20985 = r20977 * r20984;
        float r20986 = r20979 + r20985;
        float r20987 = r20975 - r20986;
        float r20988 = atan2(r20971, r20987);
        return r20988;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r20989 = lambda1;
        double r20990 = sin(r20989);
        double r20991 = lambda2;
        double r20992 = cos(r20991);
        double r20993 = r20990 * r20992;
        double r20994 = cos(r20989);
        double r20995 = -r20991;
        double r20996 = sin(r20995);
        double r20997 = r20994 * r20996;
        double r20998 = r20993 + r20997;
        double r20999 = phi2;
        double r21000 = cos(r20999);
        double r21001 = r20998 * r21000;
        double r21002 = phi1;
        double r21003 = cos(r21002);
        double r21004 = sin(r20999);
        double r21005 = r21003 * r21004;
        double r21006 = sin(r21002);
        double r21007 = r21006 * r21000;
        double r21008 = r20994 * r20992;
        double r21009 = r21007 * r21008;
        double r21010 = cbrt(r20990);
        double r21011 = r21010 * r21010;
        double r21012 = sin(r20991);
        double r21013 = r21010 * r21012;
        double r21014 = r21011 * r21013;
        double r21015 = r21007 * r21014;
        double r21016 = r21009 + r21015;
        double r21017 = r21005 - r21016;
        double r21018 = atan2(r21001, r21017);
        return r21018;
}

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 r21019, r21020, r21021, r21022, r21023, r21024, r21025, r21026, r21027, r21028, r21029, r21030, r21031, r21032, r21033, r21034, r21035;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r21019);
        mpfr_init(r21020);
        mpfr_init(r21021);
        mpfr_init(r21022);
        mpfr_init(r21023);
        mpfr_init(r21024);
        mpfr_init(r21025);
        mpfr_init(r21026);
        mpfr_init(r21027);
        mpfr_init(r21028);
        mpfr_init(r21029);
        mpfr_init(r21030);
        mpfr_init(r21031);
        mpfr_init(r21032);
        mpfr_init(r21033);
        mpfr_init(r21034);
        mpfr_init(r21035);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r21019, lambda1, MPFR_RNDN);
        mpfr_set_d(r21020, lambda2, MPFR_RNDN);
        mpfr_sub(r21021, r21019, r21020, MPFR_RNDN);
        mpfr_sin(r21022, r21021, MPFR_RNDN);
        mpfr_set_d(r21023, phi2, MPFR_RNDN);
        mpfr_cos(r21024, r21023, MPFR_RNDN);
        mpfr_mul(r21025, r21022, r21024, MPFR_RNDN);
        mpfr_set_d(r21026, phi1, MPFR_RNDN);
        mpfr_cos(r21027, r21026, MPFR_RNDN);
        mpfr_sin(r21028, r21023, MPFR_RNDN);
        mpfr_mul(r21029, r21027, r21028, MPFR_RNDN);
        mpfr_sin(r21030, r21026, MPFR_RNDN);
        mpfr_mul(r21031, r21030, r21024, MPFR_RNDN);
        mpfr_cos(r21032, r21021, MPFR_RNDN);
        mpfr_mul(r21033, r21031, r21032, MPFR_RNDN);
        mpfr_sub(r21034, r21029, r21033, MPFR_RNDN);
        mpfr_atan2(r21035, r21025, r21034, MPFR_RNDN);
        return mpfr_get_d(r21035, MPFR_RNDN);
}

static mpfr_t r21036, r21037, r21038, r21039, r21040, r21041, r21042, r21043, r21044, r21045, r21046, r21047, r21048, r21049, r21050, r21051, r21052, r21053, r21054, r21055, r21056, r21057, r21058, r21059, r21060, r21061, r21062, r21063, r21064, r21065;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r21036);
        mpfr_init(r21037);
        mpfr_init(r21038);
        mpfr_init(r21039);
        mpfr_init(r21040);
        mpfr_init(r21041);
        mpfr_init(r21042);
        mpfr_init(r21043);
        mpfr_init(r21044);
        mpfr_init(r21045);
        mpfr_init(r21046);
        mpfr_init(r21047);
        mpfr_init(r21048);
        mpfr_init(r21049);
        mpfr_init(r21050);
        mpfr_init(r21051);
        mpfr_init(r21052);
        mpfr_init(r21053);
        mpfr_init(r21054);
        mpfr_init(r21055);
        mpfr_init(r21056);
        mpfr_init(r21057);
        mpfr_init(r21058);
        mpfr_init(r21059);
        mpfr_init(r21060);
        mpfr_init(r21061);
        mpfr_init(r21062);
        mpfr_init(r21063);
        mpfr_init(r21064);
        mpfr_init(r21065);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r21036, lambda1, MPFR_RNDN);
        mpfr_sin(r21037, r21036, MPFR_RNDN);
        mpfr_set_d(r21038, lambda2, MPFR_RNDN);
        mpfr_cos(r21039, r21038, MPFR_RNDN);
        mpfr_mul(r21040, r21037, r21039, MPFR_RNDN);
        mpfr_cos(r21041, r21036, MPFR_RNDN);
        mpfr_neg(r21042, r21038, MPFR_RNDN);
        mpfr_sin(r21043, r21042, MPFR_RNDN);
        mpfr_mul(r21044, r21041, r21043, MPFR_RNDN);
        mpfr_add(r21045, r21040, r21044, MPFR_RNDN);
        mpfr_set_d(r21046, phi2, MPFR_RNDN);
        mpfr_cos(r21047, r21046, MPFR_RNDN);
        mpfr_mul(r21048, r21045, r21047, MPFR_RNDN);
        mpfr_set_d(r21049, phi1, MPFR_RNDN);
        mpfr_cos(r21050, r21049, MPFR_RNDN);
        mpfr_sin(r21051, r21046, MPFR_RNDN);
        mpfr_mul(r21052, r21050, r21051, MPFR_RNDN);
        mpfr_sin(r21053, r21049, MPFR_RNDN);
        mpfr_mul(r21054, r21053, r21047, MPFR_RNDN);
        mpfr_mul(r21055, r21041, r21039, MPFR_RNDN);
        mpfr_mul(r21056, r21054, r21055, MPFR_RNDN);
        mpfr_cbrt(r21057, r21037, MPFR_RNDN);
        mpfr_mul(r21058, r21057, r21057, MPFR_RNDN);
        mpfr_sin(r21059, r21038, MPFR_RNDN);
        mpfr_mul(r21060, r21057, r21059, MPFR_RNDN);
        mpfr_mul(r21061, r21058, r21060, MPFR_RNDN);
        mpfr_mul(r21062, r21054, r21061, MPFR_RNDN);
        mpfr_add(r21063, r21056, r21062, MPFR_RNDN);
        mpfr_sub(r21064, r21052, r21063, MPFR_RNDN);
        mpfr_atan2(r21065, r21048, r21064, MPFR_RNDN);
        return mpfr_get_d(r21065, MPFR_RNDN);
}

static mpfr_t r21066, r21067, r21068, r21069, r21070, r21071, r21072, r21073, r21074, r21075, r21076, r21077, r21078, r21079, r21080, r21081, r21082, r21083, r21084, r21085, r21086, r21087, r21088, r21089, r21090, r21091, r21092, r21093, r21094, r21095;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r21066);
        mpfr_init(r21067);
        mpfr_init(r21068);
        mpfr_init(r21069);
        mpfr_init(r21070);
        mpfr_init(r21071);
        mpfr_init(r21072);
        mpfr_init(r21073);
        mpfr_init(r21074);
        mpfr_init(r21075);
        mpfr_init(r21076);
        mpfr_init(r21077);
        mpfr_init(r21078);
        mpfr_init(r21079);
        mpfr_init(r21080);
        mpfr_init(r21081);
        mpfr_init(r21082);
        mpfr_init(r21083);
        mpfr_init(r21084);
        mpfr_init(r21085);
        mpfr_init(r21086);
        mpfr_init(r21087);
        mpfr_init(r21088);
        mpfr_init(r21089);
        mpfr_init(r21090);
        mpfr_init(r21091);
        mpfr_init(r21092);
        mpfr_init(r21093);
        mpfr_init(r21094);
        mpfr_init(r21095);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r21066, lambda1, MPFR_RNDN);
        mpfr_sin(r21067, r21066, MPFR_RNDN);
        mpfr_set_d(r21068, lambda2, MPFR_RNDN);
        mpfr_cos(r21069, r21068, MPFR_RNDN);
        mpfr_mul(r21070, r21067, r21069, MPFR_RNDN);
        mpfr_cos(r21071, r21066, MPFR_RNDN);
        mpfr_neg(r21072, r21068, MPFR_RNDN);
        mpfr_sin(r21073, r21072, MPFR_RNDN);
        mpfr_mul(r21074, r21071, r21073, MPFR_RNDN);
        mpfr_add(r21075, r21070, r21074, MPFR_RNDN);
        mpfr_set_d(r21076, phi2, MPFR_RNDN);
        mpfr_cos(r21077, r21076, MPFR_RNDN);
        mpfr_mul(r21078, r21075, r21077, MPFR_RNDN);
        mpfr_set_d(r21079, phi1, MPFR_RNDN);
        mpfr_cos(r21080, r21079, MPFR_RNDN);
        mpfr_sin(r21081, r21076, MPFR_RNDN);
        mpfr_mul(r21082, r21080, r21081, MPFR_RNDN);
        mpfr_sin(r21083, r21079, MPFR_RNDN);
        mpfr_mul(r21084, r21083, r21077, MPFR_RNDN);
        mpfr_mul(r21085, r21071, r21069, MPFR_RNDN);
        mpfr_mul(r21086, r21084, r21085, MPFR_RNDN);
        mpfr_cbrt(r21087, r21067, MPFR_RNDN);
        mpfr_mul(r21088, r21087, r21087, MPFR_RNDN);
        mpfr_sin(r21089, r21068, MPFR_RNDN);
        mpfr_mul(r21090, r21087, r21089, MPFR_RNDN);
        mpfr_mul(r21091, r21088, r21090, MPFR_RNDN);
        mpfr_mul(r21092, r21084, r21091, MPFR_RNDN);
        mpfr_add(r21093, r21086, r21092, MPFR_RNDN);
        mpfr_sub(r21094, r21082, r21093, MPFR_RNDN);
        mpfr_atan2(r21095, r21078, r21094, MPFR_RNDN);
        return mpfr_get_d(r21095, MPFR_RNDN);
}

