#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 r35165 = lambda1;
        float r35166 = theta;
        float r35167 = sin(r35166);
        float r35168 = delta;
        float r35169 = sin(r35168);
        float r35170 = r35167 * r35169;
        float r35171 = phi1;
        float r35172 = cos(r35171);
        float r35173 = r35170 * r35172;
        float r35174 = cos(r35168);
        float r35175 = sin(r35171);
        float r35176 = r35175 * r35174;
        float r35177 = r35172 * r35169;
        float r35178 = cos(r35166);
        float r35179 = r35177 * r35178;
        float r35180 = r35176 + r35179;
        float r35181 = asin(r35180);
        float r35182 = sin(r35181);
        float r35183 = r35175 * r35182;
        float r35184 = r35174 - r35183;
        float r35185 = atan2(r35173, r35184);
        float r35186 = r35165 + r35185;
        return r35186;
}

double f_id(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r35187 = lambda1;
        double r35188 = theta;
        double r35189 = sin(r35188);
        double r35190 = delta;
        double r35191 = sin(r35190);
        double r35192 = r35189 * r35191;
        double r35193 = phi1;
        double r35194 = cos(r35193);
        double r35195 = r35192 * r35194;
        double r35196 = cos(r35190);
        double r35197 = sin(r35193);
        double r35198 = r35197 * r35196;
        double r35199 = r35194 * r35191;
        double r35200 = cos(r35188);
        double r35201 = r35199 * r35200;
        double r35202 = r35198 + r35201;
        double r35203 = asin(r35202);
        double r35204 = sin(r35203);
        double r35205 = r35197 * r35204;
        double r35206 = r35196 - r35205;
        double r35207 = atan2(r35195, r35206);
        double r35208 = r35187 + r35207;
        return r35208;
}


double f_of(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r35209 = lambda1;
        float r35210 = theta;
        float r35211 = sin(r35210);
        float r35212 = delta;
        float r35213 = sin(r35212);
        float r35214 = r35211 * r35213;
        float r35215 = phi1;
        float r35216 = cos(r35215);
        float r35217 = r35214 * r35216;
        float r35218 = cos(r35212);
        float r35219 = sin(r35215);
        float r35220 = r35218 * r35219;
        float r35221 = cos(r35210);
        float r35222 = r35213 * r35221;
        float r35223 = r35222 * r35216;
        float r35224 = r35220 + r35223;
        float r35225 = asin(r35224);
        float r35226 = sin(r35225);
        float r35227 = r35226 * r35219;
        float r35228 = 3;
        float r35229 = pow(r35227, r35228);
        float r35230 = cbrt(r35229);
        float r35231 = r35218 - r35230;
        float r35232 = atan2(r35217, r35231);
        float r35233 = r35209 + r35232;
        return r35233;
}

double f_od(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r35234 = lambda1;
        double r35235 = theta;
        double r35236 = sin(r35235);
        double r35237 = delta;
        double r35238 = sin(r35237);
        double r35239 = r35236 * r35238;
        double r35240 = phi1;
        double r35241 = cos(r35240);
        double r35242 = r35239 * r35241;
        double r35243 = cos(r35237);
        double r35244 = sin(r35240);
        double r35245 = r35243 * r35244;
        double r35246 = cos(r35235);
        double r35247 = r35238 * r35246;
        double r35248 = r35247 * r35241;
        double r35249 = r35245 + r35248;
        double r35250 = asin(r35249);
        double r35251 = sin(r35250);
        double r35252 = r35251 * r35244;
        double r35253 = 3;
        double r35254 = pow(r35252, r35253);
        double r35255 = cbrt(r35254);
        double r35256 = r35243 - r35255;
        double r35257 = atan2(r35242, r35256);
        double r35258 = r35234 + r35257;
        return r35258;
}

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 r35259, r35260, r35261, r35262, r35263, r35264, r35265, r35266, r35267, r35268, r35269, r35270, r35271, r35272, r35273, r35274, r35275, r35276, r35277, r35278, r35279, r35280;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r35259);
        mpfr_init(r35260);
        mpfr_init(r35261);
        mpfr_init(r35262);
        mpfr_init(r35263);
        mpfr_init(r35264);
        mpfr_init(r35265);
        mpfr_init(r35266);
        mpfr_init(r35267);
        mpfr_init(r35268);
        mpfr_init(r35269);
        mpfr_init(r35270);
        mpfr_init(r35271);
        mpfr_init(r35272);
        mpfr_init(r35273);
        mpfr_init(r35274);
        mpfr_init(r35275);
        mpfr_init(r35276);
        mpfr_init(r35277);
        mpfr_init(r35278);
        mpfr_init(r35279);
        mpfr_init(r35280);
}

double f_im(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r35259, lambda1, MPFR_RNDN);
        mpfr_set_d(r35260, theta, MPFR_RNDN);
        mpfr_sin(r35261, r35260, MPFR_RNDN);
        mpfr_set_d(r35262, delta, MPFR_RNDN);
        mpfr_sin(r35263, r35262, MPFR_RNDN);
        mpfr_mul(r35264, r35261, r35263, MPFR_RNDN);
        mpfr_set_d(r35265, phi1, MPFR_RNDN);
        mpfr_cos(r35266, r35265, MPFR_RNDN);
        mpfr_mul(r35267, r35264, r35266, MPFR_RNDN);
        mpfr_cos(r35268, r35262, MPFR_RNDN);
        mpfr_sin(r35269, r35265, MPFR_RNDN);
        mpfr_mul(r35270, r35269, r35268, MPFR_RNDN);
        mpfr_mul(r35271, r35266, r35263, MPFR_RNDN);
        mpfr_cos(r35272, r35260, MPFR_RNDN);
        mpfr_mul(r35273, r35271, r35272, MPFR_RNDN);
        mpfr_add(r35274, r35270, r35273, MPFR_RNDN);
        mpfr_asin(r35275, r35274, MPFR_RNDN);
        mpfr_sin(r35276, r35275, MPFR_RNDN);
        mpfr_mul(r35277, r35269, r35276, MPFR_RNDN);
        mpfr_sub(r35278, r35268, r35277, MPFR_RNDN);
        mpfr_atan2(r35279, r35267, r35278, MPFR_RNDN);
        mpfr_add(r35280, r35259, r35279, MPFR_RNDN);
        return mpfr_get_d(r35280, MPFR_RNDN);
}

static mpfr_t r35281, r35282, r35283, r35284, r35285, r35286, r35287, r35288, r35289, r35290, r35291, r35292, r35293, r35294, r35295, r35296, r35297, r35298, r35299, r35300, r35301, r35302, r35303, r35304, r35305;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r35281);
        mpfr_init(r35282);
        mpfr_init(r35283);
        mpfr_init(r35284);
        mpfr_init(r35285);
        mpfr_init(r35286);
        mpfr_init(r35287);
        mpfr_init(r35288);
        mpfr_init(r35289);
        mpfr_init(r35290);
        mpfr_init(r35291);
        mpfr_init(r35292);
        mpfr_init(r35293);
        mpfr_init(r35294);
        mpfr_init(r35295);
        mpfr_init(r35296);
        mpfr_init(r35297);
        mpfr_init(r35298);
        mpfr_init(r35299);
        mpfr_init_set_str(r35300, "3", 10, MPFR_RNDN);
        mpfr_init(r35301);
        mpfr_init(r35302);
        mpfr_init(r35303);
        mpfr_init(r35304);
        mpfr_init(r35305);
}

double f_fm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r35281, lambda1, MPFR_RNDN);
        mpfr_set_d(r35282, theta, MPFR_RNDN);
        mpfr_sin(r35283, r35282, MPFR_RNDN);
        mpfr_set_d(r35284, delta, MPFR_RNDN);
        mpfr_sin(r35285, r35284, MPFR_RNDN);
        mpfr_mul(r35286, r35283, r35285, MPFR_RNDN);
        mpfr_set_d(r35287, phi1, MPFR_RNDN);
        mpfr_cos(r35288, r35287, MPFR_RNDN);
        mpfr_mul(r35289, r35286, r35288, MPFR_RNDN);
        mpfr_cos(r35290, r35284, MPFR_RNDN);
        mpfr_sin(r35291, r35287, MPFR_RNDN);
        mpfr_mul(r35292, r35290, r35291, MPFR_RNDN);
        mpfr_cos(r35293, r35282, MPFR_RNDN);
        mpfr_mul(r35294, r35285, r35293, MPFR_RNDN);
        mpfr_mul(r35295, r35294, r35288, MPFR_RNDN);
        mpfr_add(r35296, r35292, r35295, MPFR_RNDN);
        mpfr_asin(r35297, r35296, MPFR_RNDN);
        mpfr_sin(r35298, r35297, MPFR_RNDN);
        mpfr_mul(r35299, r35298, r35291, MPFR_RNDN);
        ;
        mpfr_pow(r35301, r35299, r35300, MPFR_RNDN);
        mpfr_cbrt(r35302, r35301, MPFR_RNDN);
        mpfr_sub(r35303, r35290, r35302, MPFR_RNDN);
        mpfr_atan2(r35304, r35289, r35303, MPFR_RNDN);
        mpfr_add(r35305, r35281, r35304, MPFR_RNDN);
        return mpfr_get_d(r35305, MPFR_RNDN);
}

static mpfr_t r35306, r35307, r35308, r35309, r35310, r35311, r35312, r35313, r35314, r35315, r35316, r35317, r35318, r35319, r35320, r35321, r35322, r35323, r35324, r35325, r35326, r35327, r35328, r35329, r35330;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r35306);
        mpfr_init(r35307);
        mpfr_init(r35308);
        mpfr_init(r35309);
        mpfr_init(r35310);
        mpfr_init(r35311);
        mpfr_init(r35312);
        mpfr_init(r35313);
        mpfr_init(r35314);
        mpfr_init(r35315);
        mpfr_init(r35316);
        mpfr_init(r35317);
        mpfr_init(r35318);
        mpfr_init(r35319);
        mpfr_init(r35320);
        mpfr_init(r35321);
        mpfr_init(r35322);
        mpfr_init(r35323);
        mpfr_init(r35324);
        mpfr_init_set_str(r35325, "3", 10, MPFR_RNDN);
        mpfr_init(r35326);
        mpfr_init(r35327);
        mpfr_init(r35328);
        mpfr_init(r35329);
        mpfr_init(r35330);
}

double f_dm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r35306, lambda1, MPFR_RNDN);
        mpfr_set_d(r35307, theta, MPFR_RNDN);
        mpfr_sin(r35308, r35307, MPFR_RNDN);
        mpfr_set_d(r35309, delta, MPFR_RNDN);
        mpfr_sin(r35310, r35309, MPFR_RNDN);
        mpfr_mul(r35311, r35308, r35310, MPFR_RNDN);
        mpfr_set_d(r35312, phi1, MPFR_RNDN);
        mpfr_cos(r35313, r35312, MPFR_RNDN);
        mpfr_mul(r35314, r35311, r35313, MPFR_RNDN);
        mpfr_cos(r35315, r35309, MPFR_RNDN);
        mpfr_sin(r35316, r35312, MPFR_RNDN);
        mpfr_mul(r35317, r35315, r35316, MPFR_RNDN);
        mpfr_cos(r35318, r35307, MPFR_RNDN);
        mpfr_mul(r35319, r35310, r35318, MPFR_RNDN);
        mpfr_mul(r35320, r35319, r35313, MPFR_RNDN);
        mpfr_add(r35321, r35317, r35320, MPFR_RNDN);
        mpfr_asin(r35322, r35321, MPFR_RNDN);
        mpfr_sin(r35323, r35322, MPFR_RNDN);
        mpfr_mul(r35324, r35323, r35316, MPFR_RNDN);
        ;
        mpfr_pow(r35326, r35324, r35325, MPFR_RNDN);
        mpfr_cbrt(r35327, r35326, MPFR_RNDN);
        mpfr_sub(r35328, r35315, r35327, MPFR_RNDN);
        mpfr_atan2(r35329, r35314, r35328, MPFR_RNDN);
        mpfr_add(r35330, r35306, r35329, MPFR_RNDN);
        return mpfr_get_d(r35330, MPFR_RNDN);
}

