#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 r32035 = lambda1;
        float r32036 = theta;
        float r32037 = sin(r32036);
        float r32038 = delta;
        float r32039 = sin(r32038);
        float r32040 = r32037 * r32039;
        float r32041 = phi1;
        float r32042 = cos(r32041);
        float r32043 = r32040 * r32042;
        float r32044 = cos(r32038);
        float r32045 = sin(r32041);
        float r32046 = r32045 * r32044;
        float r32047 = r32042 * r32039;
        float r32048 = cos(r32036);
        float r32049 = r32047 * r32048;
        float r32050 = r32046 + r32049;
        float r32051 = asin(r32050);
        float r32052 = sin(r32051);
        float r32053 = r32045 * r32052;
        float r32054 = r32044 - r32053;
        float r32055 = atan2(r32043, r32054);
        float r32056 = r32035 + r32055;
        return r32056;
}

double f_id(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r32057 = lambda1;
        double r32058 = theta;
        double r32059 = sin(r32058);
        double r32060 = delta;
        double r32061 = sin(r32060);
        double r32062 = r32059 * r32061;
        double r32063 = phi1;
        double r32064 = cos(r32063);
        double r32065 = r32062 * r32064;
        double r32066 = cos(r32060);
        double r32067 = sin(r32063);
        double r32068 = r32067 * r32066;
        double r32069 = r32064 * r32061;
        double r32070 = cos(r32058);
        double r32071 = r32069 * r32070;
        double r32072 = r32068 + r32071;
        double r32073 = asin(r32072);
        double r32074 = sin(r32073);
        double r32075 = r32067 * r32074;
        double r32076 = r32066 - r32075;
        double r32077 = atan2(r32065, r32076);
        double r32078 = r32057 + r32077;
        return r32078;
}


double f_of(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r32079 = lambda1;
        float r32080 = theta;
        float r32081 = sin(r32080);
        float r32082 = delta;
        float r32083 = sin(r32082);
        float r32084 = r32081 * r32083;
        float r32085 = phi1;
        float r32086 = cos(r32085);
        float r32087 = r32084 * r32086;
        float r32088 = cos(r32082);
        float r32089 = sin(r32085);
        float r32090 = r32089 * r32088;
        float r32091 = r32086 * r32083;
        float r32092 = cos(r32080);
        float r32093 = r32091 * r32092;
        float r32094 = r32090 + r32093;
        float r32095 = r32094 * (r32094 * r32094);
        float r32096 = cbrt(r32095);
        float r32097 = asin(r32096);
        float r32098 = sin(r32097);
        float r32099 = r32089 * r32098;
        float r32100 = r32088 - r32099;
        float r32101 = atan2(r32087, r32100);
        float r32102 = r32079 + r32101;
        return r32102;
}

double f_od(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r32103 = lambda1;
        double r32104 = theta;
        double r32105 = sin(r32104);
        double r32106 = delta;
        double r32107 = sin(r32106);
        double r32108 = r32105 * r32107;
        double r32109 = phi1;
        double r32110 = cos(r32109);
        double r32111 = r32108 * r32110;
        double r32112 = cos(r32106);
        double r32113 = sin(r32109);
        double r32114 = r32113 * r32112;
        double r32115 = r32110 * r32107;
        double r32116 = cos(r32104);
        double r32117 = r32115 * r32116;
        double r32118 = r32114 + r32117;
        double r32119 = r32118 * (r32118 * r32118);
        double r32120 = cbrt(r32119);
        double r32121 = asin(r32120);
        double r32122 = sin(r32121);
        double r32123 = r32113 * r32122;
        double r32124 = r32112 - r32123;
        double r32125 = atan2(r32111, r32124);
        double r32126 = r32103 + r32125;
        return r32126;
}

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 r32127, r32128, r32129, r32130, r32131, r32132, r32133, r32134, r32135, r32136, r32137, r32138, r32139, r32140, r32141, r32142, r32143, r32144, r32145, r32146, r32147, r32148;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r32127);
        mpfr_init(r32128);
        mpfr_init(r32129);
        mpfr_init(r32130);
        mpfr_init(r32131);
        mpfr_init(r32132);
        mpfr_init(r32133);
        mpfr_init(r32134);
        mpfr_init(r32135);
        mpfr_init(r32136);
        mpfr_init(r32137);
        mpfr_init(r32138);
        mpfr_init(r32139);
        mpfr_init(r32140);
        mpfr_init(r32141);
        mpfr_init(r32142);
        mpfr_init(r32143);
        mpfr_init(r32144);
        mpfr_init(r32145);
        mpfr_init(r32146);
        mpfr_init(r32147);
        mpfr_init(r32148);
}

double f_im(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r32127, lambda1, MPFR_RNDN);
        mpfr_set_d(r32128, theta, MPFR_RNDN);
        mpfr_sin(r32129, r32128, MPFR_RNDN);
        mpfr_set_d(r32130, delta, MPFR_RNDN);
        mpfr_sin(r32131, r32130, MPFR_RNDN);
        mpfr_mul(r32132, r32129, r32131, MPFR_RNDN);
        mpfr_set_d(r32133, phi1, MPFR_RNDN);
        mpfr_cos(r32134, r32133, MPFR_RNDN);
        mpfr_mul(r32135, r32132, r32134, MPFR_RNDN);
        mpfr_cos(r32136, r32130, MPFR_RNDN);
        mpfr_sin(r32137, r32133, MPFR_RNDN);
        mpfr_mul(r32138, r32137, r32136, MPFR_RNDN);
        mpfr_mul(r32139, r32134, r32131, MPFR_RNDN);
        mpfr_cos(r32140, r32128, MPFR_RNDN);
        mpfr_mul(r32141, r32139, r32140, MPFR_RNDN);
        mpfr_add(r32142, r32138, r32141, MPFR_RNDN);
        mpfr_asin(r32143, r32142, MPFR_RNDN);
        mpfr_sin(r32144, r32143, MPFR_RNDN);
        mpfr_mul(r32145, r32137, r32144, MPFR_RNDN);
        mpfr_sub(r32146, r32136, r32145, MPFR_RNDN);
        mpfr_atan2(r32147, r32135, r32146, MPFR_RNDN);
        mpfr_add(r32148, r32127, r32147, MPFR_RNDN);
        return mpfr_get_d(r32148, MPFR_RNDN);
}

static mpfr_t r32149, r32150, r32151, r32152, r32153, r32154, r32155, r32156, r32157, r32158, r32159, r32160, r32161, r32162, r32163, r32164, r32165, r32166, r32167, r32168, r32169, r32170, r32171, r32172;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r32149);
        mpfr_init(r32150);
        mpfr_init(r32151);
        mpfr_init(r32152);
        mpfr_init(r32153);
        mpfr_init(r32154);
        mpfr_init(r32155);
        mpfr_init(r32156);
        mpfr_init(r32157);
        mpfr_init(r32158);
        mpfr_init(r32159);
        mpfr_init(r32160);
        mpfr_init(r32161);
        mpfr_init(r32162);
        mpfr_init(r32163);
        mpfr_init(r32164);
        mpfr_init(r32165);
        mpfr_init(r32166);
        mpfr_init(r32167);
        mpfr_init(r32168);
        mpfr_init(r32169);
        mpfr_init(r32170);
        mpfr_init(r32171);
        mpfr_init(r32172);
}

double f_fm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r32149, lambda1, MPFR_RNDN);
        mpfr_set_d(r32150, theta, MPFR_RNDN);
        mpfr_sin(r32151, r32150, MPFR_RNDN);
        mpfr_set_d(r32152, delta, MPFR_RNDN);
        mpfr_sin(r32153, r32152, MPFR_RNDN);
        mpfr_mul(r32154, r32151, r32153, MPFR_RNDN);
        mpfr_set_d(r32155, phi1, MPFR_RNDN);
        mpfr_cos(r32156, r32155, MPFR_RNDN);
        mpfr_mul(r32157, r32154, r32156, MPFR_RNDN);
        mpfr_cos(r32158, r32152, MPFR_RNDN);
        mpfr_sin(r32159, r32155, MPFR_RNDN);
        mpfr_mul(r32160, r32159, r32158, MPFR_RNDN);
        mpfr_mul(r32161, r32156, r32153, MPFR_RNDN);
        mpfr_cos(r32162, r32150, MPFR_RNDN);
        mpfr_mul(r32163, r32161, r32162, MPFR_RNDN);
        mpfr_add(r32164, r32160, r32163, MPFR_RNDN);
        mpfr_mul(r32165, r32164, r32164, MPFR_RNDN); mpfr_mul(r32165, r32165, r32164, MPFR_RNDN);
        mpfr_cbrt(r32166, r32165, MPFR_RNDN);
        mpfr_asin(r32167, r32166, MPFR_RNDN);
        mpfr_sin(r32168, r32167, MPFR_RNDN);
        mpfr_mul(r32169, r32159, r32168, MPFR_RNDN);
        mpfr_sub(r32170, r32158, r32169, MPFR_RNDN);
        mpfr_atan2(r32171, r32157, r32170, MPFR_RNDN);
        mpfr_add(r32172, r32149, r32171, MPFR_RNDN);
        return mpfr_get_d(r32172, MPFR_RNDN);
}

static mpfr_t r32173, r32174, r32175, r32176, r32177, r32178, r32179, r32180, r32181, r32182, r32183, r32184, r32185, r32186, r32187, r32188, r32189, r32190, r32191, r32192, r32193, r32194, r32195, r32196;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r32173);
        mpfr_init(r32174);
        mpfr_init(r32175);
        mpfr_init(r32176);
        mpfr_init(r32177);
        mpfr_init(r32178);
        mpfr_init(r32179);
        mpfr_init(r32180);
        mpfr_init(r32181);
        mpfr_init(r32182);
        mpfr_init(r32183);
        mpfr_init(r32184);
        mpfr_init(r32185);
        mpfr_init(r32186);
        mpfr_init(r32187);
        mpfr_init(r32188);
        mpfr_init(r32189);
        mpfr_init(r32190);
        mpfr_init(r32191);
        mpfr_init(r32192);
        mpfr_init(r32193);
        mpfr_init(r32194);
        mpfr_init(r32195);
        mpfr_init(r32196);
}

double f_dm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r32173, lambda1, MPFR_RNDN);
        mpfr_set_d(r32174, theta, MPFR_RNDN);
        mpfr_sin(r32175, r32174, MPFR_RNDN);
        mpfr_set_d(r32176, delta, MPFR_RNDN);
        mpfr_sin(r32177, r32176, MPFR_RNDN);
        mpfr_mul(r32178, r32175, r32177, MPFR_RNDN);
        mpfr_set_d(r32179, phi1, MPFR_RNDN);
        mpfr_cos(r32180, r32179, MPFR_RNDN);
        mpfr_mul(r32181, r32178, r32180, MPFR_RNDN);
        mpfr_cos(r32182, r32176, MPFR_RNDN);
        mpfr_sin(r32183, r32179, MPFR_RNDN);
        mpfr_mul(r32184, r32183, r32182, MPFR_RNDN);
        mpfr_mul(r32185, r32180, r32177, MPFR_RNDN);
        mpfr_cos(r32186, r32174, MPFR_RNDN);
        mpfr_mul(r32187, r32185, r32186, MPFR_RNDN);
        mpfr_add(r32188, r32184, r32187, MPFR_RNDN);
        mpfr_mul(r32189, r32188, r32188, MPFR_RNDN); mpfr_mul(r32189, r32189, r32188, MPFR_RNDN);
        mpfr_cbrt(r32190, r32189, MPFR_RNDN);
        mpfr_asin(r32191, r32190, MPFR_RNDN);
        mpfr_sin(r32192, r32191, MPFR_RNDN);
        mpfr_mul(r32193, r32183, r32192, MPFR_RNDN);
        mpfr_sub(r32194, r32182, r32193, MPFR_RNDN);
        mpfr_atan2(r32195, r32181, r32194, MPFR_RNDN);
        mpfr_add(r32196, r32173, r32195, MPFR_RNDN);
        return mpfr_get_d(r32196, MPFR_RNDN);
}

