#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 r18362510 = lambda1;
        float r18362511 = lambda2;
        float r18362512 = r18362510 - r18362511;
        float r18362513 = sin(r18362512);
        float r18362514 = phi2;
        float r18362515 = cos(r18362514);
        float r18362516 = r18362513 * r18362515;
        float r18362517 = phi1;
        float r18362518 = cos(r18362517);
        float r18362519 = sin(r18362514);
        float r18362520 = r18362518 * r18362519;
        float r18362521 = sin(r18362517);
        float r18362522 = r18362521 * r18362515;
        float r18362523 = cos(r18362512);
        float r18362524 = r18362522 * r18362523;
        float r18362525 = r18362520 - r18362524;
        float r18362526 = atan2(r18362516, r18362525);
        return r18362526;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r18362527 = lambda1;
        double r18362528 = lambda2;
        double r18362529 = r18362527 - r18362528;
        double r18362530 = sin(r18362529);
        double r18362531 = phi2;
        double r18362532 = cos(r18362531);
        double r18362533 = r18362530 * r18362532;
        double r18362534 = phi1;
        double r18362535 = cos(r18362534);
        double r18362536 = sin(r18362531);
        double r18362537 = r18362535 * r18362536;
        double r18362538 = sin(r18362534);
        double r18362539 = r18362538 * r18362532;
        double r18362540 = cos(r18362529);
        double r18362541 = r18362539 * r18362540;
        double r18362542 = r18362537 - r18362541;
        double r18362543 = atan2(r18362533, r18362542);
        return r18362543;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r18362544 = lambda1;
        float r18362545 = sin(r18362544);
        float r18362546 = lambda2;
        float r18362547 = cos(r18362546);
        float r18362548 = r18362545 * r18362547;
        float r18362549 = cos(r18362544);
        float r18362550 = -r18362546;
        float r18362551 = sin(r18362550);
        float r18362552 = r18362549 * r18362551;
        float r18362553 = r18362548 + r18362552;
        float r18362554 = phi2;
        float r18362555 = cos(r18362554);
        float r18362556 = r18362553 * r18362555;
        float r18362557 = phi1;
        float r18362558 = cos(r18362557);
        float r18362559 = sin(r18362554);
        float r18362560 = r18362558 * r18362559;
        float r18362561 = sin(r18362557);
        float r18362562 = r18362561 * r18362555;
        float r18362563 = r18362549 * r18362547;
        float r18362564 = r18362562 * r18362563;
        float r18362565 = sin(r18362546);
        float r18362566 = r18362545 * r18362565;
        float r18362567 = cbrt(r18362566);
        float r18362568 = r18362567 * r18362567;
        float r18362569 = r18362568 * r18362567;
        float r18362570 = r18362562 * r18362569;
        float r18362571 = r18362564 + r18362570;
        float r18362572 = r18362560 - r18362571;
        float r18362573 = atan2(r18362556, r18362572);
        return r18362573;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r18362574 = lambda1;
        double r18362575 = sin(r18362574);
        double r18362576 = lambda2;
        double r18362577 = cos(r18362576);
        double r18362578 = r18362575 * r18362577;
        double r18362579 = cos(r18362574);
        double r18362580 = -r18362576;
        double r18362581 = sin(r18362580);
        double r18362582 = r18362579 * r18362581;
        double r18362583 = r18362578 + r18362582;
        double r18362584 = phi2;
        double r18362585 = cos(r18362584);
        double r18362586 = r18362583 * r18362585;
        double r18362587 = phi1;
        double r18362588 = cos(r18362587);
        double r18362589 = sin(r18362584);
        double r18362590 = r18362588 * r18362589;
        double r18362591 = sin(r18362587);
        double r18362592 = r18362591 * r18362585;
        double r18362593 = r18362579 * r18362577;
        double r18362594 = r18362592 * r18362593;
        double r18362595 = sin(r18362576);
        double r18362596 = r18362575 * r18362595;
        double r18362597 = cbrt(r18362596);
        double r18362598 = r18362597 * r18362597;
        double r18362599 = r18362598 * r18362597;
        double r18362600 = r18362592 * r18362599;
        double r18362601 = r18362594 + r18362600;
        double r18362602 = r18362590 - r18362601;
        double r18362603 = atan2(r18362586, r18362602);
        return r18362603;
}

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 r18362604, r18362605, r18362606, r18362607, r18362608, r18362609, r18362610, r18362611, r18362612, r18362613, r18362614, r18362615, r18362616, r18362617, r18362618, r18362619, r18362620;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r18362604);
        mpfr_init(r18362605);
        mpfr_init(r18362606);
        mpfr_init(r18362607);
        mpfr_init(r18362608);
        mpfr_init(r18362609);
        mpfr_init(r18362610);
        mpfr_init(r18362611);
        mpfr_init(r18362612);
        mpfr_init(r18362613);
        mpfr_init(r18362614);
        mpfr_init(r18362615);
        mpfr_init(r18362616);
        mpfr_init(r18362617);
        mpfr_init(r18362618);
        mpfr_init(r18362619);
        mpfr_init(r18362620);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r18362604, lambda1, MPFR_RNDN);
        mpfr_set_d(r18362605, lambda2, MPFR_RNDN);
        mpfr_sub(r18362606, r18362604, r18362605, MPFR_RNDN);
        mpfr_sin(r18362607, r18362606, MPFR_RNDN);
        mpfr_set_d(r18362608, phi2, MPFR_RNDN);
        mpfr_cos(r18362609, r18362608, MPFR_RNDN);
        mpfr_mul(r18362610, r18362607, r18362609, MPFR_RNDN);
        mpfr_set_d(r18362611, phi1, MPFR_RNDN);
        mpfr_cos(r18362612, r18362611, MPFR_RNDN);
        mpfr_sin(r18362613, r18362608, MPFR_RNDN);
        mpfr_mul(r18362614, r18362612, r18362613, MPFR_RNDN);
        mpfr_sin(r18362615, r18362611, MPFR_RNDN);
        mpfr_mul(r18362616, r18362615, r18362609, MPFR_RNDN);
        mpfr_cos(r18362617, r18362606, MPFR_RNDN);
        mpfr_mul(r18362618, r18362616, r18362617, MPFR_RNDN);
        mpfr_sub(r18362619, r18362614, r18362618, MPFR_RNDN);
        mpfr_atan2(r18362620, r18362610, r18362619, MPFR_RNDN);
        return mpfr_get_d(r18362620, MPFR_RNDN);
}

static mpfr_t r18362621, r18362622, r18362623, r18362624, r18362625, r18362626, r18362627, r18362628, r18362629, r18362630, r18362631, r18362632, r18362633, r18362634, r18362635, r18362636, r18362637, r18362638, r18362639, r18362640, r18362641, r18362642, r18362643, r18362644, r18362645, r18362646, r18362647, r18362648, r18362649, r18362650;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r18362621);
        mpfr_init(r18362622);
        mpfr_init(r18362623);
        mpfr_init(r18362624);
        mpfr_init(r18362625);
        mpfr_init(r18362626);
        mpfr_init(r18362627);
        mpfr_init(r18362628);
        mpfr_init(r18362629);
        mpfr_init(r18362630);
        mpfr_init(r18362631);
        mpfr_init(r18362632);
        mpfr_init(r18362633);
        mpfr_init(r18362634);
        mpfr_init(r18362635);
        mpfr_init(r18362636);
        mpfr_init(r18362637);
        mpfr_init(r18362638);
        mpfr_init(r18362639);
        mpfr_init(r18362640);
        mpfr_init(r18362641);
        mpfr_init(r18362642);
        mpfr_init(r18362643);
        mpfr_init(r18362644);
        mpfr_init(r18362645);
        mpfr_init(r18362646);
        mpfr_init(r18362647);
        mpfr_init(r18362648);
        mpfr_init(r18362649);
        mpfr_init(r18362650);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r18362621, lambda1, MPFR_RNDN);
        mpfr_sin(r18362622, r18362621, MPFR_RNDN);
        mpfr_set_d(r18362623, lambda2, MPFR_RNDN);
        mpfr_cos(r18362624, r18362623, MPFR_RNDN);
        mpfr_mul(r18362625, r18362622, r18362624, MPFR_RNDN);
        mpfr_cos(r18362626, r18362621, MPFR_RNDN);
        mpfr_neg(r18362627, r18362623, MPFR_RNDN);
        mpfr_sin(r18362628, r18362627, MPFR_RNDN);
        mpfr_mul(r18362629, r18362626, r18362628, MPFR_RNDN);
        mpfr_add(r18362630, r18362625, r18362629, MPFR_RNDN);
        mpfr_set_d(r18362631, phi2, MPFR_RNDN);
        mpfr_cos(r18362632, r18362631, MPFR_RNDN);
        mpfr_mul(r18362633, r18362630, r18362632, MPFR_RNDN);
        mpfr_set_d(r18362634, phi1, MPFR_RNDN);
        mpfr_cos(r18362635, r18362634, MPFR_RNDN);
        mpfr_sin(r18362636, r18362631, MPFR_RNDN);
        mpfr_mul(r18362637, r18362635, r18362636, MPFR_RNDN);
        mpfr_sin(r18362638, r18362634, MPFR_RNDN);
        mpfr_mul(r18362639, r18362638, r18362632, MPFR_RNDN);
        mpfr_mul(r18362640, r18362626, r18362624, MPFR_RNDN);
        mpfr_mul(r18362641, r18362639, r18362640, MPFR_RNDN);
        mpfr_sin(r18362642, r18362623, MPFR_RNDN);
        mpfr_mul(r18362643, r18362622, r18362642, MPFR_RNDN);
        mpfr_cbrt(r18362644, r18362643, MPFR_RNDN);
        mpfr_mul(r18362645, r18362644, r18362644, MPFR_RNDN);
        mpfr_mul(r18362646, r18362645, r18362644, MPFR_RNDN);
        mpfr_mul(r18362647, r18362639, r18362646, MPFR_RNDN);
        mpfr_add(r18362648, r18362641, r18362647, MPFR_RNDN);
        mpfr_sub(r18362649, r18362637, r18362648, MPFR_RNDN);
        mpfr_atan2(r18362650, r18362633, r18362649, MPFR_RNDN);
        return mpfr_get_d(r18362650, MPFR_RNDN);
}

static mpfr_t r18362651, r18362652, r18362653, r18362654, r18362655, r18362656, r18362657, r18362658, r18362659, r18362660, r18362661, r18362662, r18362663, r18362664, r18362665, r18362666, r18362667, r18362668, r18362669, r18362670, r18362671, r18362672, r18362673, r18362674, r18362675, r18362676, r18362677, r18362678, r18362679, r18362680;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r18362651);
        mpfr_init(r18362652);
        mpfr_init(r18362653);
        mpfr_init(r18362654);
        mpfr_init(r18362655);
        mpfr_init(r18362656);
        mpfr_init(r18362657);
        mpfr_init(r18362658);
        mpfr_init(r18362659);
        mpfr_init(r18362660);
        mpfr_init(r18362661);
        mpfr_init(r18362662);
        mpfr_init(r18362663);
        mpfr_init(r18362664);
        mpfr_init(r18362665);
        mpfr_init(r18362666);
        mpfr_init(r18362667);
        mpfr_init(r18362668);
        mpfr_init(r18362669);
        mpfr_init(r18362670);
        mpfr_init(r18362671);
        mpfr_init(r18362672);
        mpfr_init(r18362673);
        mpfr_init(r18362674);
        mpfr_init(r18362675);
        mpfr_init(r18362676);
        mpfr_init(r18362677);
        mpfr_init(r18362678);
        mpfr_init(r18362679);
        mpfr_init(r18362680);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r18362651, lambda1, MPFR_RNDN);
        mpfr_sin(r18362652, r18362651, MPFR_RNDN);
        mpfr_set_d(r18362653, lambda2, MPFR_RNDN);
        mpfr_cos(r18362654, r18362653, MPFR_RNDN);
        mpfr_mul(r18362655, r18362652, r18362654, MPFR_RNDN);
        mpfr_cos(r18362656, r18362651, MPFR_RNDN);
        mpfr_neg(r18362657, r18362653, MPFR_RNDN);
        mpfr_sin(r18362658, r18362657, MPFR_RNDN);
        mpfr_mul(r18362659, r18362656, r18362658, MPFR_RNDN);
        mpfr_add(r18362660, r18362655, r18362659, MPFR_RNDN);
        mpfr_set_d(r18362661, phi2, MPFR_RNDN);
        mpfr_cos(r18362662, r18362661, MPFR_RNDN);
        mpfr_mul(r18362663, r18362660, r18362662, MPFR_RNDN);
        mpfr_set_d(r18362664, phi1, MPFR_RNDN);
        mpfr_cos(r18362665, r18362664, MPFR_RNDN);
        mpfr_sin(r18362666, r18362661, MPFR_RNDN);
        mpfr_mul(r18362667, r18362665, r18362666, MPFR_RNDN);
        mpfr_sin(r18362668, r18362664, MPFR_RNDN);
        mpfr_mul(r18362669, r18362668, r18362662, MPFR_RNDN);
        mpfr_mul(r18362670, r18362656, r18362654, MPFR_RNDN);
        mpfr_mul(r18362671, r18362669, r18362670, MPFR_RNDN);
        mpfr_sin(r18362672, r18362653, MPFR_RNDN);
        mpfr_mul(r18362673, r18362652, r18362672, MPFR_RNDN);
        mpfr_cbrt(r18362674, r18362673, MPFR_RNDN);
        mpfr_mul(r18362675, r18362674, r18362674, MPFR_RNDN);
        mpfr_mul(r18362676, r18362675, r18362674, MPFR_RNDN);
        mpfr_mul(r18362677, r18362669, r18362676, MPFR_RNDN);
        mpfr_add(r18362678, r18362671, r18362677, MPFR_RNDN);
        mpfr_sub(r18362679, r18362667, r18362678, MPFR_RNDN);
        mpfr_atan2(r18362680, r18362663, r18362679, MPFR_RNDN);
        return mpfr_get_d(r18362680, MPFR_RNDN);
}

