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

char *name = "Spherical law of cosines";

double f_if(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r7693 = phi1;
        float r7694 = sin(r7693);
        float r7695 = phi2;
        float r7696 = sin(r7695);
        float r7697 = r7694 * r7696;
        float r7698 = cos(r7693);
        float r7699 = cos(r7695);
        float r7700 = r7698 * r7699;
        float r7701 = lambda1;
        float r7702 = lambda2;
        float r7703 = r7701 - r7702;
        float r7704 = cos(r7703);
        float r7705 = r7700 * r7704;
        float r7706 = r7697 + r7705;
        float r7707 = acos(r7706);
        float r7708 = R;
        float r7709 = r7707 * r7708;
        return r7709;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r7710 = phi1;
        double r7711 = sin(r7710);
        double r7712 = phi2;
        double r7713 = sin(r7712);
        double r7714 = r7711 * r7713;
        double r7715 = cos(r7710);
        double r7716 = cos(r7712);
        double r7717 = r7715 * r7716;
        double r7718 = lambda1;
        double r7719 = lambda2;
        double r7720 = r7718 - r7719;
        double r7721 = cos(r7720);
        double r7722 = r7717 * r7721;
        double r7723 = r7714 + r7722;
        double r7724 = acos(r7723);
        double r7725 = R;
        double r7726 = r7724 * r7725;
        return r7726;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r7727 = R;
        float r7728 = lambda2;
        float r7729 = cos(r7728);
        float r7730 = lambda1;
        float r7731 = cos(r7730);
        float r7732 = sin(r7730);
        float r7733 = sin(r7728);
        float r7734 = r7732 * r7733;
        float r7735 = fma(r7729, r7731, r7734);
        float r7736 = phi1;
        float r7737 = cos(r7736);
        float r7738 = phi2;
        float r7739 = cos(r7738);
        float r7740 = r7737 * r7739;
        float r7741 = sin(r7738);
        float r7742 = sin(r7736);
        float r7743 = r7741 * r7742;
        float r7744 = fma(r7735, r7740, r7743);
        float r7745 = acos(r7744);
        float r7746 = exp(r7745);
        float r7747 = log(r7746);
        float r7748 = log(r7747);
        float r7749 = exp(r7748);
        float r7750 = r7727 * r7749;
        return r7750;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r7751 = R;
        double r7752 = lambda2;
        double r7753 = cos(r7752);
        double r7754 = lambda1;
        double r7755 = cos(r7754);
        double r7756 = sin(r7754);
        double r7757 = sin(r7752);
        double r7758 = r7756 * r7757;
        double r7759 = fma(r7753, r7755, r7758);
        double r7760 = phi1;
        double r7761 = cos(r7760);
        double r7762 = phi2;
        double r7763 = cos(r7762);
        double r7764 = r7761 * r7763;
        double r7765 = sin(r7762);
        double r7766 = sin(r7760);
        double r7767 = r7765 * r7766;
        double r7768 = fma(r7759, r7764, r7767);
        double r7769 = acos(r7768);
        double r7770 = exp(r7769);
        double r7771 = log(r7770);
        double r7772 = log(r7771);
        double r7773 = exp(r7772);
        double r7774 = r7751 * r7773;
        return r7774;
}

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 r7775, r7776, r7777, r7778, r7779, r7780, r7781, r7782, r7783, r7784, r7785, r7786, r7787, r7788, r7789, r7790, r7791;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2128);
        mpfr_init(r7775);
        mpfr_init(r7776);
        mpfr_init(r7777);
        mpfr_init(r7778);
        mpfr_init(r7779);
        mpfr_init(r7780);
        mpfr_init(r7781);
        mpfr_init(r7782);
        mpfr_init(r7783);
        mpfr_init(r7784);
        mpfr_init(r7785);
        mpfr_init(r7786);
        mpfr_init(r7787);
        mpfr_init(r7788);
        mpfr_init(r7789);
        mpfr_init(r7790);
        mpfr_init(r7791);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r7775, phi1, MPFR_RNDN);
        mpfr_sin(r7776, r7775, MPFR_RNDN);
        mpfr_set_d(r7777, phi2, MPFR_RNDN);
        mpfr_sin(r7778, r7777, MPFR_RNDN);
        mpfr_mul(r7779, r7776, r7778, MPFR_RNDN);
        mpfr_cos(r7780, r7775, MPFR_RNDN);
        mpfr_cos(r7781, r7777, MPFR_RNDN);
        mpfr_mul(r7782, r7780, r7781, MPFR_RNDN);
        mpfr_set_d(r7783, lambda1, MPFR_RNDN);
        mpfr_set_d(r7784, lambda2, MPFR_RNDN);
        mpfr_sub(r7785, r7783, r7784, MPFR_RNDN);
        mpfr_cos(r7786, r7785, MPFR_RNDN);
        mpfr_mul(r7787, r7782, r7786, MPFR_RNDN);
        mpfr_add(r7788, r7779, r7787, MPFR_RNDN);
        mpfr_acos(r7789, r7788, MPFR_RNDN);
        mpfr_set_d(r7790, R, MPFR_RNDN);
        mpfr_mul(r7791, r7789, r7790, MPFR_RNDN);
        return mpfr_get_d(r7791, MPFR_RNDN);
}

static mpfr_t r7792, r7793, r7794, r7795, r7796, r7797, r7798, r7799, r7800, r7801, r7802, r7803, r7804, r7805, r7806, r7807, r7808, r7809, r7810, r7811, r7812, r7813, r7814, r7815;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2128);
        mpfr_init(r7792);
        mpfr_init(r7793);
        mpfr_init(r7794);
        mpfr_init(r7795);
        mpfr_init(r7796);
        mpfr_init(r7797);
        mpfr_init(r7798);
        mpfr_init(r7799);
        mpfr_init(r7800);
        mpfr_init(r7801);
        mpfr_init(r7802);
        mpfr_init(r7803);
        mpfr_init(r7804);
        mpfr_init(r7805);
        mpfr_init(r7806);
        mpfr_init(r7807);
        mpfr_init(r7808);
        mpfr_init(r7809);
        mpfr_init(r7810);
        mpfr_init(r7811);
        mpfr_init(r7812);
        mpfr_init(r7813);
        mpfr_init(r7814);
        mpfr_init(r7815);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r7792, R, MPFR_RNDN);
        mpfr_set_d(r7793, lambda2, MPFR_RNDN);
        mpfr_cos(r7794, r7793, MPFR_RNDN);
        mpfr_set_d(r7795, lambda1, MPFR_RNDN);
        mpfr_cos(r7796, r7795, MPFR_RNDN);
        mpfr_sin(r7797, r7795, MPFR_RNDN);
        mpfr_sin(r7798, r7793, MPFR_RNDN);
        mpfr_mul(r7799, r7797, r7798, MPFR_RNDN);
        mpfr_fma(r7800, r7794, r7796, r7799, MPFR_RNDN);
        mpfr_set_d(r7801, phi1, MPFR_RNDN);
        mpfr_cos(r7802, r7801, MPFR_RNDN);
        mpfr_set_d(r7803, phi2, MPFR_RNDN);
        mpfr_cos(r7804, r7803, MPFR_RNDN);
        mpfr_mul(r7805, r7802, r7804, MPFR_RNDN);
        mpfr_sin(r7806, r7803, MPFR_RNDN);
        mpfr_sin(r7807, r7801, MPFR_RNDN);
        mpfr_mul(r7808, r7806, r7807, MPFR_RNDN);
        mpfr_fma(r7809, r7800, r7805, r7808, MPFR_RNDN);
        mpfr_acos(r7810, r7809, MPFR_RNDN);
        mpfr_exp(r7811, r7810, MPFR_RNDN);
        mpfr_log(r7812, r7811, MPFR_RNDN);
        mpfr_log(r7813, r7812, MPFR_RNDN);
        mpfr_exp(r7814, r7813, MPFR_RNDN);
        mpfr_mul(r7815, r7792, r7814, MPFR_RNDN);
        return mpfr_get_d(r7815, MPFR_RNDN);
}

static mpfr_t r7816, r7817, r7818, r7819, r7820, r7821, r7822, r7823, r7824, r7825, r7826, r7827, r7828, r7829, r7830, r7831, r7832, r7833, r7834, r7835, r7836, r7837, r7838, r7839;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2128);
        mpfr_init(r7816);
        mpfr_init(r7817);
        mpfr_init(r7818);
        mpfr_init(r7819);
        mpfr_init(r7820);
        mpfr_init(r7821);
        mpfr_init(r7822);
        mpfr_init(r7823);
        mpfr_init(r7824);
        mpfr_init(r7825);
        mpfr_init(r7826);
        mpfr_init(r7827);
        mpfr_init(r7828);
        mpfr_init(r7829);
        mpfr_init(r7830);
        mpfr_init(r7831);
        mpfr_init(r7832);
        mpfr_init(r7833);
        mpfr_init(r7834);
        mpfr_init(r7835);
        mpfr_init(r7836);
        mpfr_init(r7837);
        mpfr_init(r7838);
        mpfr_init(r7839);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r7816, R, MPFR_RNDN);
        mpfr_set_d(r7817, lambda2, MPFR_RNDN);
        mpfr_cos(r7818, r7817, MPFR_RNDN);
        mpfr_set_d(r7819, lambda1, MPFR_RNDN);
        mpfr_cos(r7820, r7819, MPFR_RNDN);
        mpfr_sin(r7821, r7819, MPFR_RNDN);
        mpfr_sin(r7822, r7817, MPFR_RNDN);
        mpfr_mul(r7823, r7821, r7822, MPFR_RNDN);
        mpfr_fma(r7824, r7818, r7820, r7823, MPFR_RNDN);
        mpfr_set_d(r7825, phi1, MPFR_RNDN);
        mpfr_cos(r7826, r7825, MPFR_RNDN);
        mpfr_set_d(r7827, phi2, MPFR_RNDN);
        mpfr_cos(r7828, r7827, MPFR_RNDN);
        mpfr_mul(r7829, r7826, r7828, MPFR_RNDN);
        mpfr_sin(r7830, r7827, MPFR_RNDN);
        mpfr_sin(r7831, r7825, MPFR_RNDN);
        mpfr_mul(r7832, r7830, r7831, MPFR_RNDN);
        mpfr_fma(r7833, r7824, r7829, r7832, MPFR_RNDN);
        mpfr_acos(r7834, r7833, MPFR_RNDN);
        mpfr_exp(r7835, r7834, MPFR_RNDN);
        mpfr_log(r7836, r7835, MPFR_RNDN);
        mpfr_log(r7837, r7836, MPFR_RNDN);
        mpfr_exp(r7838, r7837, MPFR_RNDN);
        mpfr_mul(r7839, r7816, r7838, MPFR_RNDN);
        return mpfr_get_d(r7839, MPFR_RNDN);
}

