#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 r36411 = lambda1;
        float r36412 = lambda2;
        float r36413 = r36411 - r36412;
        float r36414 = sin(r36413);
        float r36415 = phi2;
        float r36416 = cos(r36415);
        float r36417 = r36414 * r36416;
        float r36418 = phi1;
        float r36419 = cos(r36418);
        float r36420 = sin(r36415);
        float r36421 = r36419 * r36420;
        float r36422 = sin(r36418);
        float r36423 = r36422 * r36416;
        float r36424 = cos(r36413);
        float r36425 = r36423 * r36424;
        float r36426 = r36421 - r36425;
        float r36427 = atan2(r36417, r36426);
        return r36427;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r36428 = lambda1;
        double r36429 = lambda2;
        double r36430 = r36428 - r36429;
        double r36431 = sin(r36430);
        double r36432 = phi2;
        double r36433 = cos(r36432);
        double r36434 = r36431 * r36433;
        double r36435 = phi1;
        double r36436 = cos(r36435);
        double r36437 = sin(r36432);
        double r36438 = r36436 * r36437;
        double r36439 = sin(r36435);
        double r36440 = r36439 * r36433;
        double r36441 = cos(r36430);
        double r36442 = r36440 * r36441;
        double r36443 = r36438 - r36442;
        double r36444 = atan2(r36434, r36443);
        return r36444;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r36445 = lambda1;
        float r36446 = sin(r36445);
        float r36447 = lambda2;
        float r36448 = cos(r36447);
        float r36449 = r36446 * r36448;
        float r36450 = cos(r36445);
        float r36451 = -r36447;
        float r36452 = sin(r36451);
        float r36453 = r36450 * r36452;
        float r36454 = r36449 + r36453;
        float r36455 = phi2;
        float r36456 = cos(r36455);
        float r36457 = r36454 * r36456;
        float r36458 = phi1;
        float r36459 = cos(r36458);
        float r36460 = sin(r36455);
        float r36461 = r36459 * r36460;
        float r36462 = sin(r36458);
        float r36463 = r36450 * r36448;
        float r36464 = r36446 * r36452;
        float r36465 = r36463 - r36464;
        float r36466 = r36456 * r36465;
        float r36467 = r36462 * r36466;
        float r36468 = r36461 - r36467;
        float r36469 = atan2(r36457, r36468);
        return r36469;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r36470 = lambda1;
        double r36471 = sin(r36470);
        double r36472 = lambda2;
        double r36473 = cos(r36472);
        double r36474 = r36471 * r36473;
        double r36475 = cos(r36470);
        double r36476 = -r36472;
        double r36477 = sin(r36476);
        double r36478 = r36475 * r36477;
        double r36479 = r36474 + r36478;
        double r36480 = phi2;
        double r36481 = cos(r36480);
        double r36482 = r36479 * r36481;
        double r36483 = phi1;
        double r36484 = cos(r36483);
        double r36485 = sin(r36480);
        double r36486 = r36484 * r36485;
        double r36487 = sin(r36483);
        double r36488 = r36475 * r36473;
        double r36489 = r36471 * r36477;
        double r36490 = r36488 - r36489;
        double r36491 = r36481 * r36490;
        double r36492 = r36487 * r36491;
        double r36493 = r36486 - r36492;
        double r36494 = atan2(r36482, r36493);
        return r36494;
}

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 r36495, r36496, r36497, r36498, r36499, r36500, r36501, r36502, r36503, r36504, r36505, r36506, r36507, r36508, r36509, r36510, r36511;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36495);
        mpfr_init(r36496);
        mpfr_init(r36497);
        mpfr_init(r36498);
        mpfr_init(r36499);
        mpfr_init(r36500);
        mpfr_init(r36501);
        mpfr_init(r36502);
        mpfr_init(r36503);
        mpfr_init(r36504);
        mpfr_init(r36505);
        mpfr_init(r36506);
        mpfr_init(r36507);
        mpfr_init(r36508);
        mpfr_init(r36509);
        mpfr_init(r36510);
        mpfr_init(r36511);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36495, lambda1, MPFR_RNDN);
        mpfr_set_d(r36496, lambda2, MPFR_RNDN);
        mpfr_sub(r36497, r36495, r36496, MPFR_RNDN);
        mpfr_sin(r36498, r36497, MPFR_RNDN);
        mpfr_set_d(r36499, phi2, MPFR_RNDN);
        mpfr_cos(r36500, r36499, MPFR_RNDN);
        mpfr_mul(r36501, r36498, r36500, MPFR_RNDN);
        mpfr_set_d(r36502, phi1, MPFR_RNDN);
        mpfr_cos(r36503, r36502, MPFR_RNDN);
        mpfr_sin(r36504, r36499, MPFR_RNDN);
        mpfr_mul(r36505, r36503, r36504, MPFR_RNDN);
        mpfr_sin(r36506, r36502, MPFR_RNDN);
        mpfr_mul(r36507, r36506, r36500, MPFR_RNDN);
        mpfr_cos(r36508, r36497, MPFR_RNDN);
        mpfr_mul(r36509, r36507, r36508, MPFR_RNDN);
        mpfr_sub(r36510, r36505, r36509, MPFR_RNDN);
        mpfr_atan2(r36511, r36501, r36510, MPFR_RNDN);
        return mpfr_get_d(r36511, MPFR_RNDN);
}

static mpfr_t r36512, r36513, r36514, r36515, r36516, r36517, r36518, r36519, r36520, r36521, r36522, r36523, r36524, r36525, r36526, r36527, r36528, r36529, r36530, r36531, r36532, r36533, r36534, r36535, r36536;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36512);
        mpfr_init(r36513);
        mpfr_init(r36514);
        mpfr_init(r36515);
        mpfr_init(r36516);
        mpfr_init(r36517);
        mpfr_init(r36518);
        mpfr_init(r36519);
        mpfr_init(r36520);
        mpfr_init(r36521);
        mpfr_init(r36522);
        mpfr_init(r36523);
        mpfr_init(r36524);
        mpfr_init(r36525);
        mpfr_init(r36526);
        mpfr_init(r36527);
        mpfr_init(r36528);
        mpfr_init(r36529);
        mpfr_init(r36530);
        mpfr_init(r36531);
        mpfr_init(r36532);
        mpfr_init(r36533);
        mpfr_init(r36534);
        mpfr_init(r36535);
        mpfr_init(r36536);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36512, lambda1, MPFR_RNDN);
        mpfr_sin(r36513, r36512, MPFR_RNDN);
        mpfr_set_d(r36514, lambda2, MPFR_RNDN);
        mpfr_cos(r36515, r36514, MPFR_RNDN);
        mpfr_mul(r36516, r36513, r36515, MPFR_RNDN);
        mpfr_cos(r36517, r36512, MPFR_RNDN);
        mpfr_neg(r36518, r36514, MPFR_RNDN);
        mpfr_sin(r36519, r36518, MPFR_RNDN);
        mpfr_mul(r36520, r36517, r36519, MPFR_RNDN);
        mpfr_add(r36521, r36516, r36520, MPFR_RNDN);
        mpfr_set_d(r36522, phi2, MPFR_RNDN);
        mpfr_cos(r36523, r36522, MPFR_RNDN);
        mpfr_mul(r36524, r36521, r36523, MPFR_RNDN);
        mpfr_set_d(r36525, phi1, MPFR_RNDN);
        mpfr_cos(r36526, r36525, MPFR_RNDN);
        mpfr_sin(r36527, r36522, MPFR_RNDN);
        mpfr_mul(r36528, r36526, r36527, MPFR_RNDN);
        mpfr_sin(r36529, r36525, MPFR_RNDN);
        mpfr_mul(r36530, r36517, r36515, MPFR_RNDN);
        mpfr_mul(r36531, r36513, r36519, MPFR_RNDN);
        mpfr_sub(r36532, r36530, r36531, MPFR_RNDN);
        mpfr_mul(r36533, r36523, r36532, MPFR_RNDN);
        mpfr_mul(r36534, r36529, r36533, MPFR_RNDN);
        mpfr_sub(r36535, r36528, r36534, MPFR_RNDN);
        mpfr_atan2(r36536, r36524, r36535, MPFR_RNDN);
        return mpfr_get_d(r36536, MPFR_RNDN);
}

static mpfr_t r36537, r36538, r36539, r36540, r36541, r36542, r36543, r36544, r36545, r36546, r36547, r36548, r36549, r36550, r36551, r36552, r36553, r36554, r36555, r36556, r36557, r36558, r36559, r36560, r36561;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r36537);
        mpfr_init(r36538);
        mpfr_init(r36539);
        mpfr_init(r36540);
        mpfr_init(r36541);
        mpfr_init(r36542);
        mpfr_init(r36543);
        mpfr_init(r36544);
        mpfr_init(r36545);
        mpfr_init(r36546);
        mpfr_init(r36547);
        mpfr_init(r36548);
        mpfr_init(r36549);
        mpfr_init(r36550);
        mpfr_init(r36551);
        mpfr_init(r36552);
        mpfr_init(r36553);
        mpfr_init(r36554);
        mpfr_init(r36555);
        mpfr_init(r36556);
        mpfr_init(r36557);
        mpfr_init(r36558);
        mpfr_init(r36559);
        mpfr_init(r36560);
        mpfr_init(r36561);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r36537, lambda1, MPFR_RNDN);
        mpfr_sin(r36538, r36537, MPFR_RNDN);
        mpfr_set_d(r36539, lambda2, MPFR_RNDN);
        mpfr_cos(r36540, r36539, MPFR_RNDN);
        mpfr_mul(r36541, r36538, r36540, MPFR_RNDN);
        mpfr_cos(r36542, r36537, MPFR_RNDN);
        mpfr_neg(r36543, r36539, MPFR_RNDN);
        mpfr_sin(r36544, r36543, MPFR_RNDN);
        mpfr_mul(r36545, r36542, r36544, MPFR_RNDN);
        mpfr_add(r36546, r36541, r36545, MPFR_RNDN);
        mpfr_set_d(r36547, phi2, MPFR_RNDN);
        mpfr_cos(r36548, r36547, MPFR_RNDN);
        mpfr_mul(r36549, r36546, r36548, MPFR_RNDN);
        mpfr_set_d(r36550, phi1, MPFR_RNDN);
        mpfr_cos(r36551, r36550, MPFR_RNDN);
        mpfr_sin(r36552, r36547, MPFR_RNDN);
        mpfr_mul(r36553, r36551, r36552, MPFR_RNDN);
        mpfr_sin(r36554, r36550, MPFR_RNDN);
        mpfr_mul(r36555, r36542, r36540, MPFR_RNDN);
        mpfr_mul(r36556, r36538, r36544, MPFR_RNDN);
        mpfr_sub(r36557, r36555, r36556, MPFR_RNDN);
        mpfr_mul(r36558, r36548, r36557, MPFR_RNDN);
        mpfr_mul(r36559, r36554, r36558, MPFR_RNDN);
        mpfr_sub(r36560, r36553, r36559, MPFR_RNDN);
        mpfr_atan2(r36561, r36549, r36560, MPFR_RNDN);
        return mpfr_get_d(r36561, MPFR_RNDN);
}

