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

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

double f_if(float lambda1, float lambda2, float phi1, float phi2) {
        float r8637 = lambda1;
        float r8638 = phi2;
        float r8639 = cos(r8638);
        float r8640 = lambda2;
        float r8641 = r8637 - r8640;
        float r8642 = sin(r8641);
        float r8643 = r8639 * r8642;
        float r8644 = phi1;
        float r8645 = cos(r8644);
        float r8646 = cos(r8641);
        float r8647 = r8639 * r8646;
        float r8648 = r8645 + r8647;
        float r8649 = atan2(r8643, r8648);
        float r8650 = r8637 + r8649;
        return r8650;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r8651 = lambda1;
        double r8652 = phi2;
        double r8653 = cos(r8652);
        double r8654 = lambda2;
        double r8655 = r8651 - r8654;
        double r8656 = sin(r8655);
        double r8657 = r8653 * r8656;
        double r8658 = phi1;
        double r8659 = cos(r8658);
        double r8660 = cos(r8655);
        double r8661 = r8653 * r8660;
        double r8662 = r8659 + r8661;
        double r8663 = atan2(r8657, r8662);
        double r8664 = r8651 + r8663;
        return r8664;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r8665 = lambda1;
        float r8666 = phi2;
        float r8667 = cos(r8666);
        float r8668 = sin(r8665);
        float r8669 = lambda2;
        float r8670 = cos(r8669);
        float r8671 = r8668 * r8670;
        float r8672 = cos(r8665);
        float r8673 = -r8669;
        float r8674 = sin(r8673);
        float r8675 = r8672 * r8674;
        float r8676 = r8671 + r8675;
        float r8677 = r8667 * r8676;
        float r8678 = phi1;
        float r8679 = cos(r8678);
        float r8680 = sin(r8669);
        float r8681 = r8668 * r8680;
        float r8682 = r8670 * r8672;
        float r8683 = r8681 + r8682;
        float r8684 = r8667 * r8683;
        float r8685 = r8679 + r8684;
        float r8686 = sqrt(r8685);
        float r8687 = r8686 * r8686;
        float r8688 = atan2(r8677, r8687);
        float r8689 = r8665 + r8688;
        float r8690 = 0.9126593546565207;
        bool r8691 = r8689 <= r8690;
        float r8692 = r8680 * r8672;
        float r8693 = r8671 - r8692;
        float r8694 = r8693 * r8667;
        float r8695 = r8680 * r8668;
        float r8696 = r8672 * r8670;
        float r8697 = r8695 + r8696;
        float r8698 = r8697 * r8667;
        float r8699 = r8698 + r8679;
        float r8700 = atan2(r8694, r8699);
        float r8701 = exp(r8700);
        float r8702 = log(r8701);
        float r8703 = r8665 + r8702;
        float r8704 = r8691 ? r8689 : r8703;
        return r8704;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r8705 = lambda1;
        double r8706 = phi2;
        double r8707 = cos(r8706);
        double r8708 = sin(r8705);
        double r8709 = lambda2;
        double r8710 = cos(r8709);
        double r8711 = r8708 * r8710;
        double r8712 = cos(r8705);
        double r8713 = -r8709;
        double r8714 = sin(r8713);
        double r8715 = r8712 * r8714;
        double r8716 = r8711 + r8715;
        double r8717 = r8707 * r8716;
        double r8718 = phi1;
        double r8719 = cos(r8718);
        double r8720 = sin(r8709);
        double r8721 = r8708 * r8720;
        double r8722 = r8710 * r8712;
        double r8723 = r8721 + r8722;
        double r8724 = r8707 * r8723;
        double r8725 = r8719 + r8724;
        double r8726 = sqrt(r8725);
        double r8727 = r8726 * r8726;
        double r8728 = atan2(r8717, r8727);
        double r8729 = r8705 + r8728;
        double r8730 = 0.9126593546565207;
        bool r8731 = r8729 <= r8730;
        double r8732 = r8720 * r8712;
        double r8733 = r8711 - r8732;
        double r8734 = r8733 * r8707;
        double r8735 = r8720 * r8708;
        double r8736 = r8712 * r8710;
        double r8737 = r8735 + r8736;
        double r8738 = r8737 * r8707;
        double r8739 = r8738 + r8719;
        double r8740 = atan2(r8734, r8739);
        double r8741 = exp(r8740);
        double r8742 = log(r8741);
        double r8743 = r8705 + r8742;
        double r8744 = r8731 ? r8729 : r8743;
        return r8744;
}

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 r8745, r8746, r8747, r8748, r8749, r8750, r8751, r8752, r8753, r8754, r8755, r8756, r8757, r8758;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8745);
        mpfr_init(r8746);
        mpfr_init(r8747);
        mpfr_init(r8748);
        mpfr_init(r8749);
        mpfr_init(r8750);
        mpfr_init(r8751);
        mpfr_init(r8752);
        mpfr_init(r8753);
        mpfr_init(r8754);
        mpfr_init(r8755);
        mpfr_init(r8756);
        mpfr_init(r8757);
        mpfr_init(r8758);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8745, lambda1, MPFR_RNDN);
        mpfr_set_d(r8746, phi2, MPFR_RNDN);
        mpfr_cos(r8747, r8746, MPFR_RNDN);
        mpfr_set_d(r8748, lambda2, MPFR_RNDN);
        mpfr_sub(r8749, r8745, r8748, MPFR_RNDN);
        mpfr_sin(r8750, r8749, MPFR_RNDN);
        mpfr_mul(r8751, r8747, r8750, MPFR_RNDN);
        mpfr_set_d(r8752, phi1, MPFR_RNDN);
        mpfr_cos(r8753, r8752, MPFR_RNDN);
        mpfr_cos(r8754, r8749, MPFR_RNDN);
        mpfr_mul(r8755, r8747, r8754, MPFR_RNDN);
        mpfr_add(r8756, r8753, r8755, MPFR_RNDN);
        mpfr_atan2(r8757, r8751, r8756, MPFR_RNDN);
        mpfr_add(r8758, r8745, r8757, MPFR_RNDN);
        return mpfr_get_d(r8758, MPFR_RNDN);
}

static mpfr_t r8759, r8760, r8761, r8762, r8763, r8764, r8765, r8766, r8767, r8768, r8769, r8770, r8771, r8772, r8773, r8774, r8775, r8776, r8777, r8778, r8779, r8780, r8781, r8782, r8783, r8784, r8785, r8786, r8787, r8788, r8789, r8790, r8791, r8792, r8793, r8794, r8795, r8796, r8797, r8798;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8759);
        mpfr_init(r8760);
        mpfr_init(r8761);
        mpfr_init(r8762);
        mpfr_init(r8763);
        mpfr_init(r8764);
        mpfr_init(r8765);
        mpfr_init(r8766);
        mpfr_init(r8767);
        mpfr_init(r8768);
        mpfr_init(r8769);
        mpfr_init(r8770);
        mpfr_init(r8771);
        mpfr_init(r8772);
        mpfr_init(r8773);
        mpfr_init(r8774);
        mpfr_init(r8775);
        mpfr_init(r8776);
        mpfr_init(r8777);
        mpfr_init(r8778);
        mpfr_init(r8779);
        mpfr_init(r8780);
        mpfr_init(r8781);
        mpfr_init(r8782);
        mpfr_init(r8783);
        mpfr_init_set_str(r8784, "0.9126593546565207", 10, MPFR_RNDN);
        mpfr_init(r8785);
        mpfr_init(r8786);
        mpfr_init(r8787);
        mpfr_init(r8788);
        mpfr_init(r8789);
        mpfr_init(r8790);
        mpfr_init(r8791);
        mpfr_init(r8792);
        mpfr_init(r8793);
        mpfr_init(r8794);
        mpfr_init(r8795);
        mpfr_init(r8796);
        mpfr_init(r8797);
        mpfr_init(r8798);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8759, lambda1, MPFR_RNDN);
        mpfr_set_d(r8760, phi2, MPFR_RNDN);
        mpfr_cos(r8761, r8760, MPFR_RNDN);
        mpfr_sin(r8762, r8759, MPFR_RNDN);
        mpfr_set_d(r8763, lambda2, MPFR_RNDN);
        mpfr_cos(r8764, r8763, MPFR_RNDN);
        mpfr_mul(r8765, r8762, r8764, MPFR_RNDN);
        mpfr_cos(r8766, r8759, MPFR_RNDN);
        mpfr_neg(r8767, r8763, MPFR_RNDN);
        mpfr_sin(r8768, r8767, MPFR_RNDN);
        mpfr_mul(r8769, r8766, r8768, MPFR_RNDN);
        mpfr_add(r8770, r8765, r8769, MPFR_RNDN);
        mpfr_mul(r8771, r8761, r8770, MPFR_RNDN);
        mpfr_set_d(r8772, phi1, MPFR_RNDN);
        mpfr_cos(r8773, r8772, MPFR_RNDN);
        mpfr_sin(r8774, r8763, MPFR_RNDN);
        mpfr_mul(r8775, r8762, r8774, MPFR_RNDN);
        mpfr_mul(r8776, r8764, r8766, MPFR_RNDN);
        mpfr_add(r8777, r8775, r8776, MPFR_RNDN);
        mpfr_mul(r8778, r8761, r8777, MPFR_RNDN);
        mpfr_add(r8779, r8773, r8778, MPFR_RNDN);
        mpfr_sqrt(r8780, r8779, MPFR_RNDN);
        mpfr_mul(r8781, r8780, r8780, MPFR_RNDN);
        mpfr_atan2(r8782, r8771, r8781, MPFR_RNDN);
        mpfr_add(r8783, r8759, r8782, MPFR_RNDN);
        ;
        mpfr_set_si(r8785, mpfr_cmp(r8783, r8784) <= 0, MPFR_RNDN);
        mpfr_mul(r8786, r8774, r8766, MPFR_RNDN);
        mpfr_sub(r8787, r8765, r8786, MPFR_RNDN);
        mpfr_mul(r8788, r8787, r8761, MPFR_RNDN);
        mpfr_mul(r8789, r8774, r8762, MPFR_RNDN);
        mpfr_mul(r8790, r8766, r8764, MPFR_RNDN);
        mpfr_add(r8791, r8789, r8790, MPFR_RNDN);
        mpfr_mul(r8792, r8791, r8761, MPFR_RNDN);
        mpfr_add(r8793, r8792, r8773, MPFR_RNDN);
        mpfr_atan2(r8794, r8788, r8793, MPFR_RNDN);
        mpfr_exp(r8795, r8794, MPFR_RNDN);
        mpfr_log(r8796, r8795, MPFR_RNDN);
        mpfr_add(r8797, r8759, r8796, MPFR_RNDN);
        if (mpfr_get_si(r8785, MPFR_RNDN)) { mpfr_set(r8798, r8783, MPFR_RNDN); } else { mpfr_set(r8798, r8797, MPFR_RNDN); };
        return mpfr_get_d(r8798, MPFR_RNDN);
}

static mpfr_t r8799, r8800, r8801, r8802, r8803, r8804, r8805, r8806, r8807, r8808, r8809, r8810, r8811, r8812, r8813, r8814, r8815, r8816, r8817, r8818, r8819, r8820, r8821, r8822, r8823, r8824, r8825, r8826, r8827, r8828, r8829, r8830, r8831, r8832, r8833, r8834, r8835, r8836, r8837, r8838;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8799);
        mpfr_init(r8800);
        mpfr_init(r8801);
        mpfr_init(r8802);
        mpfr_init(r8803);
        mpfr_init(r8804);
        mpfr_init(r8805);
        mpfr_init(r8806);
        mpfr_init(r8807);
        mpfr_init(r8808);
        mpfr_init(r8809);
        mpfr_init(r8810);
        mpfr_init(r8811);
        mpfr_init(r8812);
        mpfr_init(r8813);
        mpfr_init(r8814);
        mpfr_init(r8815);
        mpfr_init(r8816);
        mpfr_init(r8817);
        mpfr_init(r8818);
        mpfr_init(r8819);
        mpfr_init(r8820);
        mpfr_init(r8821);
        mpfr_init(r8822);
        mpfr_init(r8823);
        mpfr_init_set_str(r8824, "0.9126593546565207", 10, MPFR_RNDN);
        mpfr_init(r8825);
        mpfr_init(r8826);
        mpfr_init(r8827);
        mpfr_init(r8828);
        mpfr_init(r8829);
        mpfr_init(r8830);
        mpfr_init(r8831);
        mpfr_init(r8832);
        mpfr_init(r8833);
        mpfr_init(r8834);
        mpfr_init(r8835);
        mpfr_init(r8836);
        mpfr_init(r8837);
        mpfr_init(r8838);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8799, lambda1, MPFR_RNDN);
        mpfr_set_d(r8800, phi2, MPFR_RNDN);
        mpfr_cos(r8801, r8800, MPFR_RNDN);
        mpfr_sin(r8802, r8799, MPFR_RNDN);
        mpfr_set_d(r8803, lambda2, MPFR_RNDN);
        mpfr_cos(r8804, r8803, MPFR_RNDN);
        mpfr_mul(r8805, r8802, r8804, MPFR_RNDN);
        mpfr_cos(r8806, r8799, MPFR_RNDN);
        mpfr_neg(r8807, r8803, MPFR_RNDN);
        mpfr_sin(r8808, r8807, MPFR_RNDN);
        mpfr_mul(r8809, r8806, r8808, MPFR_RNDN);
        mpfr_add(r8810, r8805, r8809, MPFR_RNDN);
        mpfr_mul(r8811, r8801, r8810, MPFR_RNDN);
        mpfr_set_d(r8812, phi1, MPFR_RNDN);
        mpfr_cos(r8813, r8812, MPFR_RNDN);
        mpfr_sin(r8814, r8803, MPFR_RNDN);
        mpfr_mul(r8815, r8802, r8814, MPFR_RNDN);
        mpfr_mul(r8816, r8804, r8806, MPFR_RNDN);
        mpfr_add(r8817, r8815, r8816, MPFR_RNDN);
        mpfr_mul(r8818, r8801, r8817, MPFR_RNDN);
        mpfr_add(r8819, r8813, r8818, MPFR_RNDN);
        mpfr_sqrt(r8820, r8819, MPFR_RNDN);
        mpfr_mul(r8821, r8820, r8820, MPFR_RNDN);
        mpfr_atan2(r8822, r8811, r8821, MPFR_RNDN);
        mpfr_add(r8823, r8799, r8822, MPFR_RNDN);
        ;
        mpfr_set_si(r8825, mpfr_cmp(r8823, r8824) <= 0, MPFR_RNDN);
        mpfr_mul(r8826, r8814, r8806, MPFR_RNDN);
        mpfr_sub(r8827, r8805, r8826, MPFR_RNDN);
        mpfr_mul(r8828, r8827, r8801, MPFR_RNDN);
        mpfr_mul(r8829, r8814, r8802, MPFR_RNDN);
        mpfr_mul(r8830, r8806, r8804, MPFR_RNDN);
        mpfr_add(r8831, r8829, r8830, MPFR_RNDN);
        mpfr_mul(r8832, r8831, r8801, MPFR_RNDN);
        mpfr_add(r8833, r8832, r8813, MPFR_RNDN);
        mpfr_atan2(r8834, r8828, r8833, MPFR_RNDN);
        mpfr_exp(r8835, r8834, MPFR_RNDN);
        mpfr_log(r8836, r8835, MPFR_RNDN);
        mpfr_add(r8837, r8799, r8836, MPFR_RNDN);
        if (mpfr_get_si(r8825, MPFR_RNDN)) { mpfr_set(r8838, r8823, MPFR_RNDN); } else { mpfr_set(r8838, r8837, MPFR_RNDN); };
        return mpfr_get_d(r8838, MPFR_RNDN);
}

