#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 r8701 = lambda1;
        float r8702 = phi2;
        float r8703 = cos(r8702);
        float r8704 = lambda2;
        float r8705 = r8701 - r8704;
        float r8706 = sin(r8705);
        float r8707 = r8703 * r8706;
        float r8708 = phi1;
        float r8709 = cos(r8708);
        float r8710 = cos(r8705);
        float r8711 = r8703 * r8710;
        float r8712 = r8709 + r8711;
        float r8713 = atan2(r8707, r8712);
        float r8714 = r8701 + r8713;
        return r8714;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r8715 = lambda1;
        double r8716 = phi2;
        double r8717 = cos(r8716);
        double r8718 = lambda2;
        double r8719 = r8715 - r8718;
        double r8720 = sin(r8719);
        double r8721 = r8717 * r8720;
        double r8722 = phi1;
        double r8723 = cos(r8722);
        double r8724 = cos(r8719);
        double r8725 = r8717 * r8724;
        double r8726 = r8723 + r8725;
        double r8727 = atan2(r8721, r8726);
        double r8728 = r8715 + r8727;
        return r8728;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r8729 = lambda1;
        float r8730 = phi2;
        float r8731 = cos(r8730);
        float r8732 = sin(r8729);
        float r8733 = lambda2;
        float r8734 = cos(r8733);
        float r8735 = r8732 * r8734;
        float r8736 = cos(r8729);
        float r8737 = -r8733;
        float r8738 = sin(r8737);
        float r8739 = r8736 * r8738;
        float r8740 = r8735 + r8739;
        float r8741 = r8731 * r8740;
        float r8742 = phi1;
        float r8743 = cos(r8742);
        float r8744 = r8736 * r8734;
        float r8745 = r8731 * r8744;
        float r8746 = r8743 + r8745;
        float r8747 = sin(r8733);
        float r8748 = r8732 * r8747;
        float r8749 = r8731 * r8748;
        float r8750 = r8746 + r8749;
        float r8751 = atan2(r8741, r8750);
        float r8752 = r8729 + r8751;
        return r8752;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r8753 = lambda1;
        double r8754 = phi2;
        double r8755 = cos(r8754);
        double r8756 = sin(r8753);
        double r8757 = lambda2;
        double r8758 = cos(r8757);
        double r8759 = r8756 * r8758;
        double r8760 = cos(r8753);
        double r8761 = -r8757;
        double r8762 = sin(r8761);
        double r8763 = r8760 * r8762;
        double r8764 = r8759 + r8763;
        double r8765 = r8755 * r8764;
        double r8766 = phi1;
        double r8767 = cos(r8766);
        double r8768 = r8760 * r8758;
        double r8769 = r8755 * r8768;
        double r8770 = r8767 + r8769;
        double r8771 = sin(r8757);
        double r8772 = r8756 * r8771;
        double r8773 = r8755 * r8772;
        double r8774 = r8770 + r8773;
        double r8775 = atan2(r8765, r8774);
        double r8776 = r8753 + r8775;
        return r8776;
}

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 r8777, r8778, r8779, r8780, r8781, r8782, r8783, r8784, r8785, r8786, r8787, r8788, r8789, r8790;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8777);
        mpfr_init(r8778);
        mpfr_init(r8779);
        mpfr_init(r8780);
        mpfr_init(r8781);
        mpfr_init(r8782);
        mpfr_init(r8783);
        mpfr_init(r8784);
        mpfr_init(r8785);
        mpfr_init(r8786);
        mpfr_init(r8787);
        mpfr_init(r8788);
        mpfr_init(r8789);
        mpfr_init(r8790);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8777, lambda1, MPFR_RNDN);
        mpfr_set_d(r8778, phi2, MPFR_RNDN);
        mpfr_cos(r8779, r8778, MPFR_RNDN);
        mpfr_set_d(r8780, lambda2, MPFR_RNDN);
        mpfr_sub(r8781, r8777, r8780, MPFR_RNDN);
        mpfr_sin(r8782, r8781, MPFR_RNDN);
        mpfr_mul(r8783, r8779, r8782, MPFR_RNDN);
        mpfr_set_d(r8784, phi1, MPFR_RNDN);
        mpfr_cos(r8785, r8784, MPFR_RNDN);
        mpfr_cos(r8786, r8781, MPFR_RNDN);
        mpfr_mul(r8787, r8779, r8786, MPFR_RNDN);
        mpfr_add(r8788, r8785, r8787, MPFR_RNDN);
        mpfr_atan2(r8789, r8783, r8788, MPFR_RNDN);
        mpfr_add(r8790, r8777, r8789, MPFR_RNDN);
        return mpfr_get_d(r8790, MPFR_RNDN);
}

static mpfr_t r8791, r8792, r8793, r8794, r8795, r8796, r8797, r8798, r8799, r8800, r8801, r8802, r8803, r8804, r8805, r8806, r8807, r8808, r8809, r8810, r8811, r8812, r8813, r8814;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8791);
        mpfr_init(r8792);
        mpfr_init(r8793);
        mpfr_init(r8794);
        mpfr_init(r8795);
        mpfr_init(r8796);
        mpfr_init(r8797);
        mpfr_init(r8798);
        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);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8791, lambda1, MPFR_RNDN);
        mpfr_set_d(r8792, phi2, MPFR_RNDN);
        mpfr_cos(r8793, r8792, MPFR_RNDN);
        mpfr_sin(r8794, r8791, MPFR_RNDN);
        mpfr_set_d(r8795, lambda2, MPFR_RNDN);
        mpfr_cos(r8796, r8795, MPFR_RNDN);
        mpfr_mul(r8797, r8794, r8796, MPFR_RNDN);
        mpfr_cos(r8798, r8791, MPFR_RNDN);
        mpfr_neg(r8799, r8795, MPFR_RNDN);
        mpfr_sin(r8800, r8799, MPFR_RNDN);
        mpfr_mul(r8801, r8798, r8800, MPFR_RNDN);
        mpfr_add(r8802, r8797, r8801, MPFR_RNDN);
        mpfr_mul(r8803, r8793, r8802, MPFR_RNDN);
        mpfr_set_d(r8804, phi1, MPFR_RNDN);
        mpfr_cos(r8805, r8804, MPFR_RNDN);
        mpfr_mul(r8806, r8798, r8796, MPFR_RNDN);
        mpfr_mul(r8807, r8793, r8806, MPFR_RNDN);
        mpfr_add(r8808, r8805, r8807, MPFR_RNDN);
        mpfr_sin(r8809, r8795, MPFR_RNDN);
        mpfr_mul(r8810, r8794, r8809, MPFR_RNDN);
        mpfr_mul(r8811, r8793, r8810, MPFR_RNDN);
        mpfr_add(r8812, r8808, r8811, MPFR_RNDN);
        mpfr_atan2(r8813, r8803, r8812, MPFR_RNDN);
        mpfr_add(r8814, r8791, r8813, MPFR_RNDN);
        return mpfr_get_d(r8814, MPFR_RNDN);
}

static mpfr_t 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(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(r8824);
        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(r8815, lambda1, MPFR_RNDN);
        mpfr_set_d(r8816, phi2, MPFR_RNDN);
        mpfr_cos(r8817, r8816, MPFR_RNDN);
        mpfr_sin(r8818, r8815, MPFR_RNDN);
        mpfr_set_d(r8819, lambda2, MPFR_RNDN);
        mpfr_cos(r8820, r8819, MPFR_RNDN);
        mpfr_mul(r8821, r8818, r8820, MPFR_RNDN);
        mpfr_cos(r8822, r8815, MPFR_RNDN);
        mpfr_neg(r8823, r8819, MPFR_RNDN);
        mpfr_sin(r8824, r8823, MPFR_RNDN);
        mpfr_mul(r8825, r8822, r8824, MPFR_RNDN);
        mpfr_add(r8826, r8821, r8825, MPFR_RNDN);
        mpfr_mul(r8827, r8817, r8826, MPFR_RNDN);
        mpfr_set_d(r8828, phi1, MPFR_RNDN);
        mpfr_cos(r8829, r8828, MPFR_RNDN);
        mpfr_mul(r8830, r8822, r8820, MPFR_RNDN);
        mpfr_mul(r8831, r8817, r8830, MPFR_RNDN);
        mpfr_add(r8832, r8829, r8831, MPFR_RNDN);
        mpfr_sin(r8833, r8819, MPFR_RNDN);
        mpfr_mul(r8834, r8818, r8833, MPFR_RNDN);
        mpfr_mul(r8835, r8817, r8834, MPFR_RNDN);
        mpfr_add(r8836, r8832, r8835, MPFR_RNDN);
        mpfr_atan2(r8837, r8827, r8836, MPFR_RNDN);
        mpfr_add(r8838, r8815, r8837, MPFR_RNDN);
        return mpfr_get_d(r8838, MPFR_RNDN);
}

