#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 r10022 = lambda1;
        float r10023 = lambda2;
        float r10024 = r10022 - r10023;
        float r10025 = sin(r10024);
        float r10026 = phi2;
        float r10027 = cos(r10026);
        float r10028 = r10025 * r10027;
        float r10029 = phi1;
        float r10030 = cos(r10029);
        float r10031 = sin(r10026);
        float r10032 = r10030 * r10031;
        float r10033 = sin(r10029);
        float r10034 = r10033 * r10027;
        float r10035 = cos(r10024);
        float r10036 = r10034 * r10035;
        float r10037 = r10032 - r10036;
        float r10038 = atan2(r10028, r10037);
        return r10038;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r10039 = lambda1;
        double r10040 = lambda2;
        double r10041 = r10039 - r10040;
        double r10042 = sin(r10041);
        double r10043 = phi2;
        double r10044 = cos(r10043);
        double r10045 = r10042 * r10044;
        double r10046 = phi1;
        double r10047 = cos(r10046);
        double r10048 = sin(r10043);
        double r10049 = r10047 * r10048;
        double r10050 = sin(r10046);
        double r10051 = r10050 * r10044;
        double r10052 = cos(r10041);
        double r10053 = r10051 * r10052;
        double r10054 = r10049 - r10053;
        double r10055 = atan2(r10045, r10054);
        return r10055;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r10056 = lambda2;
        float r10057 = cos(r10056);
        float r10058 = lambda1;
        float r10059 = sin(r10058);
        float r10060 = r10057 * r10059;
        float r10061 = cos(r10058);
        float r10062 = sin(r10056);
        float r10063 = r10061 * r10062;
        float r10064 = r10060 - r10063;
        float r10065 = phi2;
        float r10066 = cos(r10065);
        float r10067 = r10064 * r10066;
        float r10068 = sin(r10065);
        float r10069 = phi1;
        float r10070 = cos(r10069);
        float r10071 = r10068 * r10070;
        float r10072 = sin(r10069);
        float r10073 = r10072 * r10066;
        float r10074 = r10057 * r10061;
        float r10075 = cbrt(r10059);
        float r10076 = r10075 * r10075;
        float r10077 = r10062 * r10075;
        float r10078 = r10076 * r10077;
        float r10079 = r10074 + r10078;
        float r10080 = r10073 * r10079;
        float r10081 = r10071 - r10080;
        float r10082 = atan2(r10067, r10081);
        return r10082;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r10083 = lambda2;
        double r10084 = cos(r10083);
        double r10085 = lambda1;
        double r10086 = sin(r10085);
        double r10087 = r10084 * r10086;
        double r10088 = cos(r10085);
        double r10089 = sin(r10083);
        double r10090 = r10088 * r10089;
        double r10091 = r10087 - r10090;
        double r10092 = phi2;
        double r10093 = cos(r10092);
        double r10094 = r10091 * r10093;
        double r10095 = sin(r10092);
        double r10096 = phi1;
        double r10097 = cos(r10096);
        double r10098 = r10095 * r10097;
        double r10099 = sin(r10096);
        double r10100 = r10099 * r10093;
        double r10101 = r10084 * r10088;
        double r10102 = cbrt(r10086);
        double r10103 = r10102 * r10102;
        double r10104 = r10089 * r10102;
        double r10105 = r10103 * r10104;
        double r10106 = r10101 + r10105;
        double r10107 = r10100 * r10106;
        double r10108 = r10098 - r10107;
        double r10109 = atan2(r10094, r10108);
        return r10109;
}

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 r10110, r10111, r10112, r10113, r10114, r10115, r10116, r10117, r10118, r10119, r10120, r10121, r10122, r10123, r10124, r10125, r10126;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10110);
        mpfr_init(r10111);
        mpfr_init(r10112);
        mpfr_init(r10113);
        mpfr_init(r10114);
        mpfr_init(r10115);
        mpfr_init(r10116);
        mpfr_init(r10117);
        mpfr_init(r10118);
        mpfr_init(r10119);
        mpfr_init(r10120);
        mpfr_init(r10121);
        mpfr_init(r10122);
        mpfr_init(r10123);
        mpfr_init(r10124);
        mpfr_init(r10125);
        mpfr_init(r10126);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10110, lambda1, MPFR_RNDN);
        mpfr_set_d(r10111, lambda2, MPFR_RNDN);
        mpfr_sub(r10112, r10110, r10111, MPFR_RNDN);
        mpfr_sin(r10113, r10112, MPFR_RNDN);
        mpfr_set_d(r10114, phi2, MPFR_RNDN);
        mpfr_cos(r10115, r10114, MPFR_RNDN);
        mpfr_mul(r10116, r10113, r10115, MPFR_RNDN);
        mpfr_set_d(r10117, phi1, MPFR_RNDN);
        mpfr_cos(r10118, r10117, MPFR_RNDN);
        mpfr_sin(r10119, r10114, MPFR_RNDN);
        mpfr_mul(r10120, r10118, r10119, MPFR_RNDN);
        mpfr_sin(r10121, r10117, MPFR_RNDN);
        mpfr_mul(r10122, r10121, r10115, MPFR_RNDN);
        mpfr_cos(r10123, r10112, MPFR_RNDN);
        mpfr_mul(r10124, r10122, r10123, MPFR_RNDN);
        mpfr_sub(r10125, r10120, r10124, MPFR_RNDN);
        mpfr_atan2(r10126, r10116, r10125, MPFR_RNDN);
        return mpfr_get_d(r10126, MPFR_RNDN);
}

static mpfr_t r10127, r10128, r10129, r10130, r10131, r10132, r10133, r10134, r10135, r10136, r10137, r10138, r10139, r10140, r10141, r10142, r10143, r10144, r10145, r10146, r10147, r10148, r10149, r10150, r10151, r10152, r10153;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10127);
        mpfr_init(r10128);
        mpfr_init(r10129);
        mpfr_init(r10130);
        mpfr_init(r10131);
        mpfr_init(r10132);
        mpfr_init(r10133);
        mpfr_init(r10134);
        mpfr_init(r10135);
        mpfr_init(r10136);
        mpfr_init(r10137);
        mpfr_init(r10138);
        mpfr_init(r10139);
        mpfr_init(r10140);
        mpfr_init(r10141);
        mpfr_init(r10142);
        mpfr_init(r10143);
        mpfr_init(r10144);
        mpfr_init(r10145);
        mpfr_init(r10146);
        mpfr_init(r10147);
        mpfr_init(r10148);
        mpfr_init(r10149);
        mpfr_init(r10150);
        mpfr_init(r10151);
        mpfr_init(r10152);
        mpfr_init(r10153);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10127, lambda2, MPFR_RNDN);
        mpfr_cos(r10128, r10127, MPFR_RNDN);
        mpfr_set_d(r10129, lambda1, MPFR_RNDN);
        mpfr_sin(r10130, r10129, MPFR_RNDN);
        mpfr_mul(r10131, r10128, r10130, MPFR_RNDN);
        mpfr_cos(r10132, r10129, MPFR_RNDN);
        mpfr_sin(r10133, r10127, MPFR_RNDN);
        mpfr_mul(r10134, r10132, r10133, MPFR_RNDN);
        mpfr_sub(r10135, r10131, r10134, MPFR_RNDN);
        mpfr_set_d(r10136, phi2, MPFR_RNDN);
        mpfr_cos(r10137, r10136, MPFR_RNDN);
        mpfr_mul(r10138, r10135, r10137, MPFR_RNDN);
        mpfr_sin(r10139, r10136, MPFR_RNDN);
        mpfr_set_d(r10140, phi1, MPFR_RNDN);
        mpfr_cos(r10141, r10140, MPFR_RNDN);
        mpfr_mul(r10142, r10139, r10141, MPFR_RNDN);
        mpfr_sin(r10143, r10140, MPFR_RNDN);
        mpfr_mul(r10144, r10143, r10137, MPFR_RNDN);
        mpfr_mul(r10145, r10128, r10132, MPFR_RNDN);
        mpfr_cbrt(r10146, r10130, MPFR_RNDN);
        mpfr_mul(r10147, r10146, r10146, MPFR_RNDN);
        mpfr_mul(r10148, r10133, r10146, MPFR_RNDN);
        mpfr_mul(r10149, r10147, r10148, MPFR_RNDN);
        mpfr_add(r10150, r10145, r10149, MPFR_RNDN);
        mpfr_mul(r10151, r10144, r10150, MPFR_RNDN);
        mpfr_sub(r10152, r10142, r10151, MPFR_RNDN);
        mpfr_atan2(r10153, r10138, r10152, MPFR_RNDN);
        return mpfr_get_d(r10153, MPFR_RNDN);
}

static mpfr_t r10154, r10155, r10156, r10157, r10158, r10159, r10160, r10161, r10162, r10163, r10164, r10165, r10166, r10167, r10168, r10169, r10170, r10171, r10172, r10173, r10174, r10175, r10176, r10177, r10178, r10179, r10180;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10154);
        mpfr_init(r10155);
        mpfr_init(r10156);
        mpfr_init(r10157);
        mpfr_init(r10158);
        mpfr_init(r10159);
        mpfr_init(r10160);
        mpfr_init(r10161);
        mpfr_init(r10162);
        mpfr_init(r10163);
        mpfr_init(r10164);
        mpfr_init(r10165);
        mpfr_init(r10166);
        mpfr_init(r10167);
        mpfr_init(r10168);
        mpfr_init(r10169);
        mpfr_init(r10170);
        mpfr_init(r10171);
        mpfr_init(r10172);
        mpfr_init(r10173);
        mpfr_init(r10174);
        mpfr_init(r10175);
        mpfr_init(r10176);
        mpfr_init(r10177);
        mpfr_init(r10178);
        mpfr_init(r10179);
        mpfr_init(r10180);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10154, lambda2, MPFR_RNDN);
        mpfr_cos(r10155, r10154, MPFR_RNDN);
        mpfr_set_d(r10156, lambda1, MPFR_RNDN);
        mpfr_sin(r10157, r10156, MPFR_RNDN);
        mpfr_mul(r10158, r10155, r10157, MPFR_RNDN);
        mpfr_cos(r10159, r10156, MPFR_RNDN);
        mpfr_sin(r10160, r10154, MPFR_RNDN);
        mpfr_mul(r10161, r10159, r10160, MPFR_RNDN);
        mpfr_sub(r10162, r10158, r10161, MPFR_RNDN);
        mpfr_set_d(r10163, phi2, MPFR_RNDN);
        mpfr_cos(r10164, r10163, MPFR_RNDN);
        mpfr_mul(r10165, r10162, r10164, MPFR_RNDN);
        mpfr_sin(r10166, r10163, MPFR_RNDN);
        mpfr_set_d(r10167, phi1, MPFR_RNDN);
        mpfr_cos(r10168, r10167, MPFR_RNDN);
        mpfr_mul(r10169, r10166, r10168, MPFR_RNDN);
        mpfr_sin(r10170, r10167, MPFR_RNDN);
        mpfr_mul(r10171, r10170, r10164, MPFR_RNDN);
        mpfr_mul(r10172, r10155, r10159, MPFR_RNDN);
        mpfr_cbrt(r10173, r10157, MPFR_RNDN);
        mpfr_mul(r10174, r10173, r10173, MPFR_RNDN);
        mpfr_mul(r10175, r10160, r10173, MPFR_RNDN);
        mpfr_mul(r10176, r10174, r10175, MPFR_RNDN);
        mpfr_add(r10177, r10172, r10176, MPFR_RNDN);
        mpfr_mul(r10178, r10171, r10177, MPFR_RNDN);
        mpfr_sub(r10179, r10169, r10178, MPFR_RNDN);
        mpfr_atan2(r10180, r10165, r10179, MPFR_RNDN);
        return mpfr_get_d(r10180, MPFR_RNDN);
}

