#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 r35337 = lambda1;
        float r35338 = theta;
        float r35339 = sin(r35338);
        float r35340 = delta;
        float r35341 = sin(r35340);
        float r35342 = r35339 * r35341;
        float r35343 = phi1;
        float r35344 = cos(r35343);
        float r35345 = r35342 * r35344;
        float r35346 = cos(r35340);
        float r35347 = sin(r35343);
        float r35348 = r35347 * r35346;
        float r35349 = r35344 * r35341;
        float r35350 = cos(r35338);
        float r35351 = r35349 * r35350;
        float r35352 = r35348 + r35351;
        float r35353 = asin(r35352);
        float r35354 = sin(r35353);
        float r35355 = r35347 * r35354;
        float r35356 = r35346 - r35355;
        float r35357 = atan2(r35345, r35356);
        float r35358 = r35337 + r35357;
        return r35358;
}

double f_id(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r35359 = lambda1;
        double r35360 = theta;
        double r35361 = sin(r35360);
        double r35362 = delta;
        double r35363 = sin(r35362);
        double r35364 = r35361 * r35363;
        double r35365 = phi1;
        double r35366 = cos(r35365);
        double r35367 = r35364 * r35366;
        double r35368 = cos(r35362);
        double r35369 = sin(r35365);
        double r35370 = r35369 * r35368;
        double r35371 = r35366 * r35363;
        double r35372 = cos(r35360);
        double r35373 = r35371 * r35372;
        double r35374 = r35370 + r35373;
        double r35375 = asin(r35374);
        double r35376 = sin(r35375);
        double r35377 = r35369 * r35376;
        double r35378 = r35368 - r35377;
        double r35379 = atan2(r35367, r35378);
        double r35380 = r35359 + r35379;
        return r35380;
}


double f_of(float lambda1, float phi1, float __attribute__((unused)) phi2, float delta, float theta) {
        float r35381 = lambda1;
        float r35382 = theta;
        float r35383 = sin(r35382);
        float r35384 = delta;
        float r35385 = sin(r35384);
        float r35386 = r35383 * r35385;
        float r35387 = phi1;
        float r35388 = cos(r35387);
        float r35389 = r35386 * r35388;
        float r35390 = cos(r35384);
        float r35391 = sin(r35387);
        float r35392 = r35390 * r35391;
        float r35393 = cos(r35382);
        float r35394 = r35385 * r35393;
        float r35395 = r35394 * r35388;
        float r35396 = r35392 + r35395;
        float r35397 = asin(r35396);
        float r35398 = sin(r35397);
        float r35399 = r35398 * r35391;
        float r35400 = 3;
        float r35401 = pow(r35399, r35400);
        float r35402 = cbrt(r35401);
        float r35403 = r35390 - r35402;
        float r35404 = atan2(r35389, r35403);
        float r35405 = r35381 + r35404;
        return r35405;
}

double f_od(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        double r35406 = lambda1;
        double r35407 = theta;
        double r35408 = sin(r35407);
        double r35409 = delta;
        double r35410 = sin(r35409);
        double r35411 = r35408 * r35410;
        double r35412 = phi1;
        double r35413 = cos(r35412);
        double r35414 = r35411 * r35413;
        double r35415 = cos(r35409);
        double r35416 = sin(r35412);
        double r35417 = r35415 * r35416;
        double r35418 = cos(r35407);
        double r35419 = r35410 * r35418;
        double r35420 = r35419 * r35413;
        double r35421 = r35417 + r35420;
        double r35422 = asin(r35421);
        double r35423 = sin(r35422);
        double r35424 = r35423 * r35416;
        double r35425 = 3;
        double r35426 = pow(r35424, r35425);
        double r35427 = cbrt(r35426);
        double r35428 = r35415 - r35427;
        double r35429 = atan2(r35414, r35428);
        double r35430 = r35406 + r35429;
        return r35430;
}

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 r35431, r35432, r35433, r35434, r35435, r35436, r35437, r35438, r35439, r35440, r35441, r35442, r35443, r35444, r35445, r35446, r35447, r35448, r35449, r35450, r35451, r35452;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r35431);
        mpfr_init(r35432);
        mpfr_init(r35433);
        mpfr_init(r35434);
        mpfr_init(r35435);
        mpfr_init(r35436);
        mpfr_init(r35437);
        mpfr_init(r35438);
        mpfr_init(r35439);
        mpfr_init(r35440);
        mpfr_init(r35441);
        mpfr_init(r35442);
        mpfr_init(r35443);
        mpfr_init(r35444);
        mpfr_init(r35445);
        mpfr_init(r35446);
        mpfr_init(r35447);
        mpfr_init(r35448);
        mpfr_init(r35449);
        mpfr_init(r35450);
        mpfr_init(r35451);
        mpfr_init(r35452);
}

double f_im(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r35431, lambda1, MPFR_RNDN);
        mpfr_set_d(r35432, theta, MPFR_RNDN);
        mpfr_sin(r35433, r35432, MPFR_RNDN);
        mpfr_set_d(r35434, delta, MPFR_RNDN);
        mpfr_sin(r35435, r35434, MPFR_RNDN);
        mpfr_mul(r35436, r35433, r35435, MPFR_RNDN);
        mpfr_set_d(r35437, phi1, MPFR_RNDN);
        mpfr_cos(r35438, r35437, MPFR_RNDN);
        mpfr_mul(r35439, r35436, r35438, MPFR_RNDN);
        mpfr_cos(r35440, r35434, MPFR_RNDN);
        mpfr_sin(r35441, r35437, MPFR_RNDN);
        mpfr_mul(r35442, r35441, r35440, MPFR_RNDN);
        mpfr_mul(r35443, r35438, r35435, MPFR_RNDN);
        mpfr_cos(r35444, r35432, MPFR_RNDN);
        mpfr_mul(r35445, r35443, r35444, MPFR_RNDN);
        mpfr_add(r35446, r35442, r35445, MPFR_RNDN);
        mpfr_asin(r35447, r35446, MPFR_RNDN);
        mpfr_sin(r35448, r35447, MPFR_RNDN);
        mpfr_mul(r35449, r35441, r35448, MPFR_RNDN);
        mpfr_sub(r35450, r35440, r35449, MPFR_RNDN);
        mpfr_atan2(r35451, r35439, r35450, MPFR_RNDN);
        mpfr_add(r35452, r35431, r35451, MPFR_RNDN);
        return mpfr_get_d(r35452, MPFR_RNDN);
}

static mpfr_t r35453, r35454, r35455, r35456, r35457, r35458, r35459, r35460, r35461, r35462, r35463, r35464, r35465, r35466, r35467, r35468, r35469, r35470, r35471, r35472, r35473, r35474, r35475, r35476, r35477;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r35453);
        mpfr_init(r35454);
        mpfr_init(r35455);
        mpfr_init(r35456);
        mpfr_init(r35457);
        mpfr_init(r35458);
        mpfr_init(r35459);
        mpfr_init(r35460);
        mpfr_init(r35461);
        mpfr_init(r35462);
        mpfr_init(r35463);
        mpfr_init(r35464);
        mpfr_init(r35465);
        mpfr_init(r35466);
        mpfr_init(r35467);
        mpfr_init(r35468);
        mpfr_init(r35469);
        mpfr_init(r35470);
        mpfr_init(r35471);
        mpfr_init_set_str(r35472, "3", 10, MPFR_RNDN);
        mpfr_init(r35473);
        mpfr_init(r35474);
        mpfr_init(r35475);
        mpfr_init(r35476);
        mpfr_init(r35477);
}

double f_fm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r35453, lambda1, MPFR_RNDN);
        mpfr_set_d(r35454, theta, MPFR_RNDN);
        mpfr_sin(r35455, r35454, MPFR_RNDN);
        mpfr_set_d(r35456, delta, MPFR_RNDN);
        mpfr_sin(r35457, r35456, MPFR_RNDN);
        mpfr_mul(r35458, r35455, r35457, MPFR_RNDN);
        mpfr_set_d(r35459, phi1, MPFR_RNDN);
        mpfr_cos(r35460, r35459, MPFR_RNDN);
        mpfr_mul(r35461, r35458, r35460, MPFR_RNDN);
        mpfr_cos(r35462, r35456, MPFR_RNDN);
        mpfr_sin(r35463, r35459, MPFR_RNDN);
        mpfr_mul(r35464, r35462, r35463, MPFR_RNDN);
        mpfr_cos(r35465, r35454, MPFR_RNDN);
        mpfr_mul(r35466, r35457, r35465, MPFR_RNDN);
        mpfr_mul(r35467, r35466, r35460, MPFR_RNDN);
        mpfr_add(r35468, r35464, r35467, MPFR_RNDN);
        mpfr_asin(r35469, r35468, MPFR_RNDN);
        mpfr_sin(r35470, r35469, MPFR_RNDN);
        mpfr_mul(r35471, r35470, r35463, MPFR_RNDN);
        ;
        mpfr_pow(r35473, r35471, r35472, MPFR_RNDN);
        mpfr_cbrt(r35474, r35473, MPFR_RNDN);
        mpfr_sub(r35475, r35462, r35474, MPFR_RNDN);
        mpfr_atan2(r35476, r35461, r35475, MPFR_RNDN);
        mpfr_add(r35477, r35453, r35476, MPFR_RNDN);
        return mpfr_get_d(r35477, MPFR_RNDN);
}

static mpfr_t r35478, r35479, r35480, r35481, r35482, r35483, r35484, r35485, r35486, r35487, r35488, r35489, r35490, r35491, r35492, r35493, r35494, r35495, r35496, r35497, r35498, r35499, r35500, r35501, r35502;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r35478);
        mpfr_init(r35479);
        mpfr_init(r35480);
        mpfr_init(r35481);
        mpfr_init(r35482);
        mpfr_init(r35483);
        mpfr_init(r35484);
        mpfr_init(r35485);
        mpfr_init(r35486);
        mpfr_init(r35487);
        mpfr_init(r35488);
        mpfr_init(r35489);
        mpfr_init(r35490);
        mpfr_init(r35491);
        mpfr_init(r35492);
        mpfr_init(r35493);
        mpfr_init(r35494);
        mpfr_init(r35495);
        mpfr_init(r35496);
        mpfr_init_set_str(r35497, "3", 10, MPFR_RNDN);
        mpfr_init(r35498);
        mpfr_init(r35499);
        mpfr_init(r35500);
        mpfr_init(r35501);
        mpfr_init(r35502);
}

double f_dm(double lambda1, double phi1, double __attribute__((unused)) phi2, double delta, double theta) {
        mpfr_set_d(r35478, lambda1, MPFR_RNDN);
        mpfr_set_d(r35479, theta, MPFR_RNDN);
        mpfr_sin(r35480, r35479, MPFR_RNDN);
        mpfr_set_d(r35481, delta, MPFR_RNDN);
        mpfr_sin(r35482, r35481, MPFR_RNDN);
        mpfr_mul(r35483, r35480, r35482, MPFR_RNDN);
        mpfr_set_d(r35484, phi1, MPFR_RNDN);
        mpfr_cos(r35485, r35484, MPFR_RNDN);
        mpfr_mul(r35486, r35483, r35485, MPFR_RNDN);
        mpfr_cos(r35487, r35481, MPFR_RNDN);
        mpfr_sin(r35488, r35484, MPFR_RNDN);
        mpfr_mul(r35489, r35487, r35488, MPFR_RNDN);
        mpfr_cos(r35490, r35479, MPFR_RNDN);
        mpfr_mul(r35491, r35482, r35490, MPFR_RNDN);
        mpfr_mul(r35492, r35491, r35485, MPFR_RNDN);
        mpfr_add(r35493, r35489, r35492, MPFR_RNDN);
        mpfr_asin(r35494, r35493, MPFR_RNDN);
        mpfr_sin(r35495, r35494, MPFR_RNDN);
        mpfr_mul(r35496, r35495, r35488, MPFR_RNDN);
        ;
        mpfr_pow(r35498, r35496, r35497, MPFR_RNDN);
        mpfr_cbrt(r35499, r35498, MPFR_RNDN);
        mpfr_sub(r35500, r35487, r35499, MPFR_RNDN);
        mpfr_atan2(r35501, r35486, r35500, MPFR_RNDN);
        mpfr_add(r35502, r35478, r35501, MPFR_RNDN);
        return mpfr_get_d(r35502, MPFR_RNDN);
}

