#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 r26567 = lambda1;
        float r26568 = lambda2;
        float r26569 = r26567 - r26568;
        float r26570 = sin(r26569);
        float r26571 = phi2;
        float r26572 = cos(r26571);
        float r26573 = r26570 * r26572;
        float r26574 = phi1;
        float r26575 = cos(r26574);
        float r26576 = sin(r26571);
        float r26577 = r26575 * r26576;
        float r26578 = sin(r26574);
        float r26579 = r26578 * r26572;
        float r26580 = cos(r26569);
        float r26581 = r26579 * r26580;
        float r26582 = r26577 - r26581;
        float r26583 = atan2(r26573, r26582);
        return r26583;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r26584 = lambda1;
        double r26585 = lambda2;
        double r26586 = r26584 - r26585;
        double r26587 = sin(r26586);
        double r26588 = phi2;
        double r26589 = cos(r26588);
        double r26590 = r26587 * r26589;
        double r26591 = phi1;
        double r26592 = cos(r26591);
        double r26593 = sin(r26588);
        double r26594 = r26592 * r26593;
        double r26595 = sin(r26591);
        double r26596 = r26595 * r26589;
        double r26597 = cos(r26586);
        double r26598 = r26596 * r26597;
        double r26599 = r26594 - r26598;
        double r26600 = atan2(r26590, r26599);
        return r26600;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r26601 = lambda1;
        float r26602 = sin(r26601);
        float r26603 = lambda2;
        float r26604 = cos(r26603);
        float r26605 = r26602 * r26604;
        float r26606 = cos(r26601);
        float r26607 = -r26603;
        float r26608 = sin(r26607);
        float r26609 = r26606 * r26608;
        float r26610 = r26605 + r26609;
        float r26611 = phi2;
        float r26612 = cos(r26611);
        float r26613 = r26610 * r26612;
        float r26614 = phi1;
        float r26615 = cos(r26614);
        float r26616 = sin(r26611);
        float r26617 = r26615 * r26616;
        float r26618 = sin(r26603);
        float r26619 = r26604 * r26606;
        float r26620 = fma(r26618, r26602, r26619);
        float r26621 = sin(r26614);
        float r26622 = r26612 * r26621;
        float r26623 = r26620 * r26622;
        float r26624 = expm1(r26623);
        float r26625 = log1p(r26624);
        float r26626 = r26617 - r26625;
        float r26627 = atan2(r26613, r26626);
        return r26627;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r26628 = lambda1;
        double r26629 = sin(r26628);
        double r26630 = lambda2;
        double r26631 = cos(r26630);
        double r26632 = r26629 * r26631;
        double r26633 = cos(r26628);
        double r26634 = -r26630;
        double r26635 = sin(r26634);
        double r26636 = r26633 * r26635;
        double r26637 = r26632 + r26636;
        double r26638 = phi2;
        double r26639 = cos(r26638);
        double r26640 = r26637 * r26639;
        double r26641 = phi1;
        double r26642 = cos(r26641);
        double r26643 = sin(r26638);
        double r26644 = r26642 * r26643;
        double r26645 = sin(r26630);
        double r26646 = r26631 * r26633;
        double r26647 = fma(r26645, r26629, r26646);
        double r26648 = sin(r26641);
        double r26649 = r26639 * r26648;
        double r26650 = r26647 * r26649;
        double r26651 = expm1(r26650);
        double r26652 = log1p(r26651);
        double r26653 = r26644 - r26652;
        double r26654 = atan2(r26640, r26653);
        return r26654;
}

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 r26655, r26656, r26657, r26658, r26659, r26660, r26661, r26662, r26663, r26664, r26665, r26666, r26667, r26668, r26669, r26670, r26671;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26655);
        mpfr_init(r26656);
        mpfr_init(r26657);
        mpfr_init(r26658);
        mpfr_init(r26659);
        mpfr_init(r26660);
        mpfr_init(r26661);
        mpfr_init(r26662);
        mpfr_init(r26663);
        mpfr_init(r26664);
        mpfr_init(r26665);
        mpfr_init(r26666);
        mpfr_init(r26667);
        mpfr_init(r26668);
        mpfr_init(r26669);
        mpfr_init(r26670);
        mpfr_init(r26671);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26655, lambda1, MPFR_RNDN);
        mpfr_set_d(r26656, lambda2, MPFR_RNDN);
        mpfr_sub(r26657, r26655, r26656, MPFR_RNDN);
        mpfr_sin(r26658, r26657, MPFR_RNDN);
        mpfr_set_d(r26659, phi2, MPFR_RNDN);
        mpfr_cos(r26660, r26659, MPFR_RNDN);
        mpfr_mul(r26661, r26658, r26660, MPFR_RNDN);
        mpfr_set_d(r26662, phi1, MPFR_RNDN);
        mpfr_cos(r26663, r26662, MPFR_RNDN);
        mpfr_sin(r26664, r26659, MPFR_RNDN);
        mpfr_mul(r26665, r26663, r26664, MPFR_RNDN);
        mpfr_sin(r26666, r26662, MPFR_RNDN);
        mpfr_mul(r26667, r26666, r26660, MPFR_RNDN);
        mpfr_cos(r26668, r26657, MPFR_RNDN);
        mpfr_mul(r26669, r26667, r26668, MPFR_RNDN);
        mpfr_sub(r26670, r26665, r26669, MPFR_RNDN);
        mpfr_atan2(r26671, r26661, r26670, MPFR_RNDN);
        return mpfr_get_d(r26671, MPFR_RNDN);
}

static mpfr_t r26672, r26673, r26674, r26675, r26676, r26677, r26678, r26679, r26680, r26681, r26682, r26683, r26684, r26685, r26686, r26687, r26688, r26689, r26690, r26691, r26692, r26693, r26694, r26695, r26696, r26697, r26698;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26672);
        mpfr_init(r26673);
        mpfr_init(r26674);
        mpfr_init(r26675);
        mpfr_init(r26676);
        mpfr_init(r26677);
        mpfr_init(r26678);
        mpfr_init(r26679);
        mpfr_init(r26680);
        mpfr_init(r26681);
        mpfr_init(r26682);
        mpfr_init(r26683);
        mpfr_init(r26684);
        mpfr_init(r26685);
        mpfr_init(r26686);
        mpfr_init(r26687);
        mpfr_init(r26688);
        mpfr_init(r26689);
        mpfr_init(r26690);
        mpfr_init(r26691);
        mpfr_init(r26692);
        mpfr_init(r26693);
        mpfr_init(r26694);
        mpfr_init(r26695);
        mpfr_init(r26696);
        mpfr_init(r26697);
        mpfr_init(r26698);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26672, lambda1, MPFR_RNDN);
        mpfr_sin(r26673, r26672, MPFR_RNDN);
        mpfr_set_d(r26674, lambda2, MPFR_RNDN);
        mpfr_cos(r26675, r26674, MPFR_RNDN);
        mpfr_mul(r26676, r26673, r26675, MPFR_RNDN);
        mpfr_cos(r26677, r26672, MPFR_RNDN);
        mpfr_neg(r26678, r26674, MPFR_RNDN);
        mpfr_sin(r26679, r26678, MPFR_RNDN);
        mpfr_mul(r26680, r26677, r26679, MPFR_RNDN);
        mpfr_add(r26681, r26676, r26680, MPFR_RNDN);
        mpfr_set_d(r26682, phi2, MPFR_RNDN);
        mpfr_cos(r26683, r26682, MPFR_RNDN);
        mpfr_mul(r26684, r26681, r26683, MPFR_RNDN);
        mpfr_set_d(r26685, phi1, MPFR_RNDN);
        mpfr_cos(r26686, r26685, MPFR_RNDN);
        mpfr_sin(r26687, r26682, MPFR_RNDN);
        mpfr_mul(r26688, r26686, r26687, MPFR_RNDN);
        mpfr_sin(r26689, r26674, MPFR_RNDN);
        mpfr_mul(r26690, r26675, r26677, MPFR_RNDN);
        mpfr_fma(r26691, r26689, r26673, r26690, MPFR_RNDN);
        mpfr_sin(r26692, r26685, MPFR_RNDN);
        mpfr_mul(r26693, r26683, r26692, MPFR_RNDN);
        mpfr_mul(r26694, r26691, r26693, MPFR_RNDN);
        mpfr_expm1(r26695, r26694, MPFR_RNDN);
        mpfr_log1p(r26696, r26695, MPFR_RNDN);
        mpfr_sub(r26697, r26688, r26696, MPFR_RNDN);
        mpfr_atan2(r26698, r26684, r26697, MPFR_RNDN);
        return mpfr_get_d(r26698, MPFR_RNDN);
}

static mpfr_t r26699, r26700, r26701, r26702, r26703, r26704, r26705, r26706, r26707, r26708, r26709, r26710, r26711, r26712, r26713, r26714, r26715, r26716, r26717, r26718, r26719, r26720, r26721, r26722, r26723, r26724, r26725;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26699);
        mpfr_init(r26700);
        mpfr_init(r26701);
        mpfr_init(r26702);
        mpfr_init(r26703);
        mpfr_init(r26704);
        mpfr_init(r26705);
        mpfr_init(r26706);
        mpfr_init(r26707);
        mpfr_init(r26708);
        mpfr_init(r26709);
        mpfr_init(r26710);
        mpfr_init(r26711);
        mpfr_init(r26712);
        mpfr_init(r26713);
        mpfr_init(r26714);
        mpfr_init(r26715);
        mpfr_init(r26716);
        mpfr_init(r26717);
        mpfr_init(r26718);
        mpfr_init(r26719);
        mpfr_init(r26720);
        mpfr_init(r26721);
        mpfr_init(r26722);
        mpfr_init(r26723);
        mpfr_init(r26724);
        mpfr_init(r26725);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26699, lambda1, MPFR_RNDN);
        mpfr_sin(r26700, r26699, MPFR_RNDN);
        mpfr_set_d(r26701, lambda2, MPFR_RNDN);
        mpfr_cos(r26702, r26701, MPFR_RNDN);
        mpfr_mul(r26703, r26700, r26702, MPFR_RNDN);
        mpfr_cos(r26704, r26699, MPFR_RNDN);
        mpfr_neg(r26705, r26701, MPFR_RNDN);
        mpfr_sin(r26706, r26705, MPFR_RNDN);
        mpfr_mul(r26707, r26704, r26706, MPFR_RNDN);
        mpfr_add(r26708, r26703, r26707, MPFR_RNDN);
        mpfr_set_d(r26709, phi2, MPFR_RNDN);
        mpfr_cos(r26710, r26709, MPFR_RNDN);
        mpfr_mul(r26711, r26708, r26710, MPFR_RNDN);
        mpfr_set_d(r26712, phi1, MPFR_RNDN);
        mpfr_cos(r26713, r26712, MPFR_RNDN);
        mpfr_sin(r26714, r26709, MPFR_RNDN);
        mpfr_mul(r26715, r26713, r26714, MPFR_RNDN);
        mpfr_sin(r26716, r26701, MPFR_RNDN);
        mpfr_mul(r26717, r26702, r26704, MPFR_RNDN);
        mpfr_fma(r26718, r26716, r26700, r26717, MPFR_RNDN);
        mpfr_sin(r26719, r26712, MPFR_RNDN);
        mpfr_mul(r26720, r26710, r26719, MPFR_RNDN);
        mpfr_mul(r26721, r26718, r26720, MPFR_RNDN);
        mpfr_expm1(r26722, r26721, MPFR_RNDN);
        mpfr_log1p(r26723, r26722, MPFR_RNDN);
        mpfr_sub(r26724, r26715, r26723, MPFR_RNDN);
        mpfr_atan2(r26725, r26711, r26724, MPFR_RNDN);
        return mpfr_get_d(r26725, MPFR_RNDN);
}

