#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Distance on a great circle";

double f_if(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r31565 = R;
        float r31566 = 2.0f;
        float r31567 = phi1;
        float r31568 = phi2;
        float r31569 = r31567 - r31568;
        float r31570 = r31569 / r31566;
        float r31571 = sin(r31570);
        float r31572 = r31571 * r31571;
        float r31573 = cos(r31567);
        float r31574 = cos(r31568);
        float r31575 = r31573 * r31574;
        float r31576 = lambda1;
        float r31577 = lambda2;
        float r31578 = r31576 - r31577;
        float r31579 = r31578 / r31566;
        float r31580 = sin(r31579);
        float r31581 = r31575 * r31580;
        float r31582 = r31581 * r31580;
        float r31583 = r31572 + r31582;
        float r31584 = sqrt(r31583);
        float r31585 = 1.0f;
        float r31586 = r31585 - r31583;
        float r31587 = sqrt(r31586);
        float r31588 = atan2(r31584, r31587);
        float r31589 = r31566 * r31588;
        float r31590 = r31565 * r31589;
        return r31590;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r31591 = R;
        double r31592 = 2.0;
        double r31593 = phi1;
        double r31594 = phi2;
        double r31595 = r31593 - r31594;
        double r31596 = r31595 / r31592;
        double r31597 = sin(r31596);
        double r31598 = r31597 * r31597;
        double r31599 = cos(r31593);
        double r31600 = cos(r31594);
        double r31601 = r31599 * r31600;
        double r31602 = lambda1;
        double r31603 = lambda2;
        double r31604 = r31602 - r31603;
        double r31605 = r31604 / r31592;
        double r31606 = sin(r31605);
        double r31607 = r31601 * r31606;
        double r31608 = r31607 * r31606;
        double r31609 = r31598 + r31608;
        double r31610 = sqrt(r31609);
        double r31611 = 1.0;
        double r31612 = r31611 - r31609;
        double r31613 = sqrt(r31612);
        double r31614 = atan2(r31610, r31613);
        double r31615 = r31592 * r31614;
        double r31616 = r31591 * r31615;
        return r31616;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r31617 = R;
        float r31618 = r31617 + r31617;
        float r31619 = phi1;
        float r31620 = cos(r31619);
        float r31621 = lambda1;
        float r31622 = lambda2;
        float r31623 = r31621 - r31622;
        float r31624 = 2.0f;
        float r31625 = r31623 / r31624;
        float r31626 = sin(r31625);
        float r31627 = r31620 * r31626;
        float r31628 = phi2;
        float r31629 = cos(r31628);
        float r31630 = r31629 * r31626;
        float r31631 = r31627 * r31630;
        float r31632 = r31619 - r31628;
        float r31633 = r31632 / r31624;
        float r31634 = sin(r31633);
        float r31635 = r31634 * r31634;
        float r31636 = r31631 + r31635;
        float r31637 = sqrt(r31636);
        float r31638 = cos(r31633);
        float r31639 = r31638 * r31638;
        float r31640 = exp(r31626);
        float r31641 = log(r31640);
        float r31642 = r31629 * r31641;
        float r31643 = r31627 * r31642;
        float r31644 = r31639 - r31643;
        float r31645 = sqrt(r31644);
        float r31646 = atan2(r31637, r31645);
        float r31647 = r31618 * r31646;
        return r31647;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r31648 = R;
        double r31649 = r31648 + r31648;
        double r31650 = phi1;
        double r31651 = cos(r31650);
        double r31652 = lambda1;
        double r31653 = lambda2;
        double r31654 = r31652 - r31653;
        double r31655 = 2.0;
        double r31656 = r31654 / r31655;
        double r31657 = sin(r31656);
        double r31658 = r31651 * r31657;
        double r31659 = phi2;
        double r31660 = cos(r31659);
        double r31661 = r31660 * r31657;
        double r31662 = r31658 * r31661;
        double r31663 = r31650 - r31659;
        double r31664 = r31663 / r31655;
        double r31665 = sin(r31664);
        double r31666 = r31665 * r31665;
        double r31667 = r31662 + r31666;
        double r31668 = sqrt(r31667);
        double r31669 = cos(r31664);
        double r31670 = r31669 * r31669;
        double r31671 = exp(r31657);
        double r31672 = log(r31671);
        double r31673 = r31660 * r31672;
        double r31674 = r31658 * r31673;
        double r31675 = r31670 - r31674;
        double r31676 = sqrt(r31675);
        double r31677 = atan2(r31668, r31676);
        double r31678 = r31649 * r31677;
        return r31678;
}

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 r31679, r31680, r31681, r31682, r31683, r31684, r31685, r31686, r31687, r31688, r31689, r31690, r31691, r31692, r31693, r31694, r31695, r31696, r31697, r31698, r31699, r31700, r31701, r31702, r31703, r31704;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r31679);
        mpfr_init_set_str(r31680, "2", 10, MPFR_RNDN);
        mpfr_init(r31681);
        mpfr_init(r31682);
        mpfr_init(r31683);
        mpfr_init(r31684);
        mpfr_init(r31685);
        mpfr_init(r31686);
        mpfr_init(r31687);
        mpfr_init(r31688);
        mpfr_init(r31689);
        mpfr_init(r31690);
        mpfr_init(r31691);
        mpfr_init(r31692);
        mpfr_init(r31693);
        mpfr_init(r31694);
        mpfr_init(r31695);
        mpfr_init(r31696);
        mpfr_init(r31697);
        mpfr_init(r31698);
        mpfr_init_set_str(r31699, "1", 10, MPFR_RNDN);
        mpfr_init(r31700);
        mpfr_init(r31701);
        mpfr_init(r31702);
        mpfr_init(r31703);
        mpfr_init(r31704);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r31679, R, MPFR_RNDN);
        ;
        mpfr_set_d(r31681, phi1, MPFR_RNDN);
        mpfr_set_d(r31682, phi2, MPFR_RNDN);
        mpfr_sub(r31683, r31681, r31682, MPFR_RNDN);
        mpfr_div(r31684, r31683, r31680, MPFR_RNDN);
        mpfr_sin(r31685, r31684, MPFR_RNDN);
        mpfr_sqr(r31686, r31685, MPFR_RNDN);
        mpfr_cos(r31687, r31681, MPFR_RNDN);
        mpfr_cos(r31688, r31682, MPFR_RNDN);
        mpfr_mul(r31689, r31687, r31688, MPFR_RNDN);
        mpfr_set_d(r31690, lambda1, MPFR_RNDN);
        mpfr_set_d(r31691, lambda2, MPFR_RNDN);
        mpfr_sub(r31692, r31690, r31691, MPFR_RNDN);
        mpfr_div(r31693, r31692, r31680, MPFR_RNDN);
        mpfr_sin(r31694, r31693, MPFR_RNDN);
        mpfr_mul(r31695, r31689, r31694, MPFR_RNDN);
        mpfr_mul(r31696, r31695, r31694, MPFR_RNDN);
        mpfr_add(r31697, r31686, r31696, MPFR_RNDN);
        mpfr_sqrt(r31698, r31697, MPFR_RNDN);
        ;
        mpfr_sub(r31700, r31699, r31697, MPFR_RNDN);
        mpfr_sqrt(r31701, r31700, MPFR_RNDN);
        mpfr_atan2(r31702, r31698, r31701, MPFR_RNDN);
        mpfr_mul(r31703, r31680, r31702, MPFR_RNDN);
        mpfr_mul(r31704, r31679, r31703, MPFR_RNDN);
        return mpfr_get_d(r31704, MPFR_RNDN);
}

static mpfr_t r31705, r31706, r31707, r31708, r31709, r31710, r31711, r31712, r31713, r31714, r31715, r31716, r31717, r31718, r31719, r31720, r31721, r31722, r31723, r31724, r31725, r31726, r31727, r31728, r31729, r31730, r31731, r31732, r31733, r31734, r31735;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r31705);
        mpfr_init(r31706);
        mpfr_init(r31707);
        mpfr_init(r31708);
        mpfr_init(r31709);
        mpfr_init(r31710);
        mpfr_init(r31711);
        mpfr_init_set_str(r31712, "2", 10, MPFR_RNDN);
        mpfr_init(r31713);
        mpfr_init(r31714);
        mpfr_init(r31715);
        mpfr_init(r31716);
        mpfr_init(r31717);
        mpfr_init(r31718);
        mpfr_init(r31719);
        mpfr_init(r31720);
        mpfr_init(r31721);
        mpfr_init(r31722);
        mpfr_init(r31723);
        mpfr_init(r31724);
        mpfr_init(r31725);
        mpfr_init(r31726);
        mpfr_init(r31727);
        mpfr_init(r31728);
        mpfr_init(r31729);
        mpfr_init(r31730);
        mpfr_init(r31731);
        mpfr_init(r31732);
        mpfr_init(r31733);
        mpfr_init(r31734);
        mpfr_init(r31735);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r31705, R, MPFR_RNDN);
        mpfr_add(r31706, r31705, r31705, MPFR_RNDN);
        mpfr_set_d(r31707, phi1, MPFR_RNDN);
        mpfr_cos(r31708, r31707, MPFR_RNDN);
        mpfr_set_d(r31709, lambda1, MPFR_RNDN);
        mpfr_set_d(r31710, lambda2, MPFR_RNDN);
        mpfr_sub(r31711, r31709, r31710, MPFR_RNDN);
        ;
        mpfr_div(r31713, r31711, r31712, MPFR_RNDN);
        mpfr_sin(r31714, r31713, MPFR_RNDN);
        mpfr_mul(r31715, r31708, r31714, MPFR_RNDN);
        mpfr_set_d(r31716, phi2, MPFR_RNDN);
        mpfr_cos(r31717, r31716, MPFR_RNDN);
        mpfr_mul(r31718, r31717, r31714, MPFR_RNDN);
        mpfr_mul(r31719, r31715, r31718, MPFR_RNDN);
        mpfr_sub(r31720, r31707, r31716, MPFR_RNDN);
        mpfr_div(r31721, r31720, r31712, MPFR_RNDN);
        mpfr_sin(r31722, r31721, MPFR_RNDN);
        mpfr_sqr(r31723, r31722, MPFR_RNDN);
        mpfr_add(r31724, r31719, r31723, MPFR_RNDN);
        mpfr_sqrt(r31725, r31724, MPFR_RNDN);
        mpfr_cos(r31726, r31721, MPFR_RNDN);
        mpfr_sqr(r31727, r31726, MPFR_RNDN);
        mpfr_exp(r31728, r31714, MPFR_RNDN);
        mpfr_log(r31729, r31728, MPFR_RNDN);
        mpfr_mul(r31730, r31717, r31729, MPFR_RNDN);
        mpfr_mul(r31731, r31715, r31730, MPFR_RNDN);
        mpfr_sub(r31732, r31727, r31731, MPFR_RNDN);
        mpfr_sqrt(r31733, r31732, MPFR_RNDN);
        mpfr_atan2(r31734, r31725, r31733, MPFR_RNDN);
        mpfr_mul(r31735, r31706, r31734, MPFR_RNDN);
        return mpfr_get_d(r31735, MPFR_RNDN);
}

static mpfr_t r31736, r31737, r31738, r31739, r31740, r31741, r31742, r31743, r31744, r31745, r31746, r31747, r31748, r31749, r31750, r31751, r31752, r31753, r31754, r31755, r31756, r31757, r31758, r31759, r31760, r31761, r31762, r31763, r31764, r31765, r31766;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r31736);
        mpfr_init(r31737);
        mpfr_init(r31738);
        mpfr_init(r31739);
        mpfr_init(r31740);
        mpfr_init(r31741);
        mpfr_init(r31742);
        mpfr_init_set_str(r31743, "2", 10, MPFR_RNDN);
        mpfr_init(r31744);
        mpfr_init(r31745);
        mpfr_init(r31746);
        mpfr_init(r31747);
        mpfr_init(r31748);
        mpfr_init(r31749);
        mpfr_init(r31750);
        mpfr_init(r31751);
        mpfr_init(r31752);
        mpfr_init(r31753);
        mpfr_init(r31754);
        mpfr_init(r31755);
        mpfr_init(r31756);
        mpfr_init(r31757);
        mpfr_init(r31758);
        mpfr_init(r31759);
        mpfr_init(r31760);
        mpfr_init(r31761);
        mpfr_init(r31762);
        mpfr_init(r31763);
        mpfr_init(r31764);
        mpfr_init(r31765);
        mpfr_init(r31766);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r31736, R, MPFR_RNDN);
        mpfr_add(r31737, r31736, r31736, MPFR_RNDN);
        mpfr_set_d(r31738, phi1, MPFR_RNDN);
        mpfr_cos(r31739, r31738, MPFR_RNDN);
        mpfr_set_d(r31740, lambda1, MPFR_RNDN);
        mpfr_set_d(r31741, lambda2, MPFR_RNDN);
        mpfr_sub(r31742, r31740, r31741, MPFR_RNDN);
        ;
        mpfr_div(r31744, r31742, r31743, MPFR_RNDN);
        mpfr_sin(r31745, r31744, MPFR_RNDN);
        mpfr_mul(r31746, r31739, r31745, MPFR_RNDN);
        mpfr_set_d(r31747, phi2, MPFR_RNDN);
        mpfr_cos(r31748, r31747, MPFR_RNDN);
        mpfr_mul(r31749, r31748, r31745, MPFR_RNDN);
        mpfr_mul(r31750, r31746, r31749, MPFR_RNDN);
        mpfr_sub(r31751, r31738, r31747, MPFR_RNDN);
        mpfr_div(r31752, r31751, r31743, MPFR_RNDN);
        mpfr_sin(r31753, r31752, MPFR_RNDN);
        mpfr_sqr(r31754, r31753, MPFR_RNDN);
        mpfr_add(r31755, r31750, r31754, MPFR_RNDN);
        mpfr_sqrt(r31756, r31755, MPFR_RNDN);
        mpfr_cos(r31757, r31752, MPFR_RNDN);
        mpfr_sqr(r31758, r31757, MPFR_RNDN);
        mpfr_exp(r31759, r31745, MPFR_RNDN);
        mpfr_log(r31760, r31759, MPFR_RNDN);
        mpfr_mul(r31761, r31748, r31760, MPFR_RNDN);
        mpfr_mul(r31762, r31746, r31761, MPFR_RNDN);
        mpfr_sub(r31763, r31758, r31762, MPFR_RNDN);
        mpfr_sqrt(r31764, r31763, MPFR_RNDN);
        mpfr_atan2(r31765, r31756, r31764, MPFR_RNDN);
        mpfr_mul(r31766, r31737, r31765, MPFR_RNDN);
        return mpfr_get_d(r31766, MPFR_RNDN);
}

