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

char *name = "Destination given bearing on a great circle";

double f_if(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r25639 = lambda1;
        float r25640 = theta;
        float r25641 = sin(r25640);
        float r25642 = delta;
        float r25643 = sin(r25642);
        float r25644 = r25641 * r25643;
        float r25645 = phi1;
        float r25646 = cos(r25645);
        float r25647 = r25644 * r25646;
        float r25648 = cos(r25642);
        float r25649 = sin(r25645);
        float r25650 = r25649 * r25648;
        float r25651 = r25646 * r25643;
        float r25652 = cos(r25640);
        float r25653 = r25651 * r25652;
        float r25654 = r25650 + r25653;
        float r25655 = asin(r25654);
        float r25656 = sin(r25655);
        float r25657 = r25649 * r25656;
        float r25658 = r25648 - r25657;
        float r25659 = atan2(r25647, r25658);
        float r25660 = r25639 + r25659;
        return r25660;
}

double f_id(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r25661 = lambda1;
        double r25662 = theta;
        double r25663 = sin(r25662);
        double r25664 = delta;
        double r25665 = sin(r25664);
        double r25666 = r25663 * r25665;
        double r25667 = phi1;
        double r25668 = cos(r25667);
        double r25669 = r25666 * r25668;
        double r25670 = cos(r25664);
        double r25671 = sin(r25667);
        double r25672 = r25671 * r25670;
        double r25673 = r25668 * r25665;
        double r25674 = cos(r25662);
        double r25675 = r25673 * r25674;
        double r25676 = r25672 + r25675;
        double r25677 = asin(r25676);
        double r25678 = sin(r25677);
        double r25679 = r25671 * r25678;
        double r25680 = r25670 - r25679;
        double r25681 = atan2(r25669, r25680);
        double r25682 = r25661 + r25681;
        return r25682;
}


double f_of(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r25683 = lambda1;
        float r25684 = theta;
        float r25685 = sin(r25684);
        float r25686 = delta;
        float r25687 = sin(r25686);
        float r25688 = r25685 * r25687;
        float r25689 = phi1;
        float r25690 = cos(r25689);
        float r25691 = r25688 * r25690;
        float r25692 = cos(r25686);
        float r25693 = r25692 * r25692;
        float r25694 = sin(r25689);
        float r25695 = r25694 * r25692;
        float r25696 = r25690 * r25687;
        float r25697 = cos(r25684);
        float r25698 = r25696 * r25697;
        float r25699 = r25695 + r25698;
        float r25700 = asin(r25699);
        float r25701 = sin(r25700);
        float r25702 = r25694 * r25701;
        float r25703 = r25702 * r25702;
        float r25704 = r25693 - r25703;
        float r25705 = r25692 + r25702;
        float r25706 = r25704 / r25705;
        float r25707 = atan2(r25691, r25706);
        float r25708 = r25683 + r25707;
        return r25708;
}

double f_od(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r25709 = lambda1;
        double r25710 = theta;
        double r25711 = sin(r25710);
        double r25712 = delta;
        double r25713 = sin(r25712);
        double r25714 = r25711 * r25713;
        double r25715 = phi1;
        double r25716 = cos(r25715);
        double r25717 = r25714 * r25716;
        double r25718 = cos(r25712);
        double r25719 = r25718 * r25718;
        double r25720 = sin(r25715);
        double r25721 = r25720 * r25718;
        double r25722 = r25716 * r25713;
        double r25723 = cos(r25710);
        double r25724 = r25722 * r25723;
        double r25725 = r25721 + r25724;
        double r25726 = asin(r25725);
        double r25727 = sin(r25726);
        double r25728 = r25720 * r25727;
        double r25729 = r25728 * r25728;
        double r25730 = r25719 - r25729;
        double r25731 = r25718 + r25728;
        double r25732 = r25730 / r25731;
        double r25733 = atan2(r25717, r25732);
        double r25734 = r25709 + r25733;
        return r25734;
}

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 r25735, r25736, r25737, r25738, r25739, r25740, r25741, r25742, r25743, r25744, r25745, r25746, r25747, r25748, r25749, r25750, r25751, r25752, r25753, r25754, r25755, r25756;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r25735);
        mpfr_init(r25736);
        mpfr_init(r25737);
        mpfr_init(r25738);
        mpfr_init(r25739);
        mpfr_init(r25740);
        mpfr_init(r25741);
        mpfr_init(r25742);
        mpfr_init(r25743);
        mpfr_init(r25744);
        mpfr_init(r25745);
        mpfr_init(r25746);
        mpfr_init(r25747);
        mpfr_init(r25748);
        mpfr_init(r25749);
        mpfr_init(r25750);
        mpfr_init(r25751);
        mpfr_init(r25752);
        mpfr_init(r25753);
        mpfr_init(r25754);
        mpfr_init(r25755);
        mpfr_init(r25756);
}

double f_im(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r25735, lambda1, MPFR_RNDN);
        mpfr_set_d(r25736, theta, MPFR_RNDN);
        mpfr_sin(r25737, r25736, MPFR_RNDN);
        mpfr_set_d(r25738, delta, MPFR_RNDN);
        mpfr_sin(r25739, r25738, MPFR_RNDN);
        mpfr_mul(r25740, r25737, r25739, MPFR_RNDN);
        mpfr_set_d(r25741, phi1, MPFR_RNDN);
        mpfr_cos(r25742, r25741, MPFR_RNDN);
        mpfr_mul(r25743, r25740, r25742, MPFR_RNDN);
        mpfr_cos(r25744, r25738, MPFR_RNDN);
        mpfr_sin(r25745, r25741, MPFR_RNDN);
        mpfr_mul(r25746, r25745, r25744, MPFR_RNDN);
        mpfr_mul(r25747, r25742, r25739, MPFR_RNDN);
        mpfr_cos(r25748, r25736, MPFR_RNDN);
        mpfr_mul(r25749, r25747, r25748, MPFR_RNDN);
        mpfr_add(r25750, r25746, r25749, MPFR_RNDN);
        mpfr_asin(r25751, r25750, MPFR_RNDN);
        mpfr_sin(r25752, r25751, MPFR_RNDN);
        mpfr_mul(r25753, r25745, r25752, MPFR_RNDN);
        mpfr_sub(r25754, r25744, r25753, MPFR_RNDN);
        mpfr_atan2(r25755, r25743, r25754, MPFR_RNDN);
        mpfr_add(r25756, r25735, r25755, MPFR_RNDN);
        return mpfr_get_d(r25756, MPFR_RNDN);
}

static mpfr_t r25757, r25758, r25759, r25760, r25761, r25762, r25763, r25764, r25765, r25766, r25767, r25768, r25769, r25770, r25771, r25772, r25773, r25774, r25775, r25776, r25777, r25778, r25779, r25780, r25781, r25782;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r25757);
        mpfr_init(r25758);
        mpfr_init(r25759);
        mpfr_init(r25760);
        mpfr_init(r25761);
        mpfr_init(r25762);
        mpfr_init(r25763);
        mpfr_init(r25764);
        mpfr_init(r25765);
        mpfr_init(r25766);
        mpfr_init(r25767);
        mpfr_init(r25768);
        mpfr_init(r25769);
        mpfr_init(r25770);
        mpfr_init(r25771);
        mpfr_init(r25772);
        mpfr_init(r25773);
        mpfr_init(r25774);
        mpfr_init(r25775);
        mpfr_init(r25776);
        mpfr_init(r25777);
        mpfr_init(r25778);
        mpfr_init(r25779);
        mpfr_init(r25780);
        mpfr_init(r25781);
        mpfr_init(r25782);
}

double f_fm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r25757, lambda1, MPFR_RNDN);
        mpfr_set_d(r25758, theta, MPFR_RNDN);
        mpfr_sin(r25759, r25758, MPFR_RNDN);
        mpfr_set_d(r25760, delta, MPFR_RNDN);
        mpfr_sin(r25761, r25760, MPFR_RNDN);
        mpfr_mul(r25762, r25759, r25761, MPFR_RNDN);
        mpfr_set_d(r25763, phi1, MPFR_RNDN);
        mpfr_cos(r25764, r25763, MPFR_RNDN);
        mpfr_mul(r25765, r25762, r25764, MPFR_RNDN);
        mpfr_cos(r25766, r25760, MPFR_RNDN);
        mpfr_mul(r25767, r25766, r25766, MPFR_RNDN);
        mpfr_sin(r25768, r25763, MPFR_RNDN);
        mpfr_mul(r25769, r25768, r25766, MPFR_RNDN);
        mpfr_mul(r25770, r25764, r25761, MPFR_RNDN);
        mpfr_cos(r25771, r25758, MPFR_RNDN);
        mpfr_mul(r25772, r25770, r25771, MPFR_RNDN);
        mpfr_add(r25773, r25769, r25772, MPFR_RNDN);
        mpfr_asin(r25774, r25773, MPFR_RNDN);
        mpfr_sin(r25775, r25774, MPFR_RNDN);
        mpfr_mul(r25776, r25768, r25775, MPFR_RNDN);
        mpfr_mul(r25777, r25776, r25776, MPFR_RNDN);
        mpfr_sub(r25778, r25767, r25777, MPFR_RNDN);
        mpfr_add(r25779, r25766, r25776, MPFR_RNDN);
        mpfr_div(r25780, r25778, r25779, MPFR_RNDN);
        mpfr_atan2(r25781, r25765, r25780, MPFR_RNDN);
        mpfr_add(r25782, r25757, r25781, MPFR_RNDN);
        return mpfr_get_d(r25782, MPFR_RNDN);
}

static mpfr_t r25783, r25784, r25785, r25786, r25787, r25788, r25789, r25790, r25791, r25792, r25793, r25794, r25795, r25796, r25797, r25798, r25799, r25800, r25801, r25802, r25803, r25804, r25805, r25806, r25807, r25808;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r25783);
        mpfr_init(r25784);
        mpfr_init(r25785);
        mpfr_init(r25786);
        mpfr_init(r25787);
        mpfr_init(r25788);
        mpfr_init(r25789);
        mpfr_init(r25790);
        mpfr_init(r25791);
        mpfr_init(r25792);
        mpfr_init(r25793);
        mpfr_init(r25794);
        mpfr_init(r25795);
        mpfr_init(r25796);
        mpfr_init(r25797);
        mpfr_init(r25798);
        mpfr_init(r25799);
        mpfr_init(r25800);
        mpfr_init(r25801);
        mpfr_init(r25802);
        mpfr_init(r25803);
        mpfr_init(r25804);
        mpfr_init(r25805);
        mpfr_init(r25806);
        mpfr_init(r25807);
        mpfr_init(r25808);
}

double f_dm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r25783, lambda1, MPFR_RNDN);
        mpfr_set_d(r25784, theta, MPFR_RNDN);
        mpfr_sin(r25785, r25784, MPFR_RNDN);
        mpfr_set_d(r25786, delta, MPFR_RNDN);
        mpfr_sin(r25787, r25786, MPFR_RNDN);
        mpfr_mul(r25788, r25785, r25787, MPFR_RNDN);
        mpfr_set_d(r25789, phi1, MPFR_RNDN);
        mpfr_cos(r25790, r25789, MPFR_RNDN);
        mpfr_mul(r25791, r25788, r25790, MPFR_RNDN);
        mpfr_cos(r25792, r25786, MPFR_RNDN);
        mpfr_mul(r25793, r25792, r25792, MPFR_RNDN);
        mpfr_sin(r25794, r25789, MPFR_RNDN);
        mpfr_mul(r25795, r25794, r25792, MPFR_RNDN);
        mpfr_mul(r25796, r25790, r25787, MPFR_RNDN);
        mpfr_cos(r25797, r25784, MPFR_RNDN);
        mpfr_mul(r25798, r25796, r25797, MPFR_RNDN);
        mpfr_add(r25799, r25795, r25798, MPFR_RNDN);
        mpfr_asin(r25800, r25799, MPFR_RNDN);
        mpfr_sin(r25801, r25800, MPFR_RNDN);
        mpfr_mul(r25802, r25794, r25801, MPFR_RNDN);
        mpfr_mul(r25803, r25802, r25802, MPFR_RNDN);
        mpfr_sub(r25804, r25793, r25803, MPFR_RNDN);
        mpfr_add(r25805, r25792, r25802, MPFR_RNDN);
        mpfr_div(r25806, r25804, r25805, MPFR_RNDN);
        mpfr_atan2(r25807, r25791, r25806, MPFR_RNDN);
        mpfr_add(r25808, r25783, r25807, MPFR_RNDN);
        return mpfr_get_d(r25808, MPFR_RNDN);
}

