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

char *name = "Bearing on a great circle";

double f_if(float lambda1, float lambda2, float phi1, float phi2) {
        float r26345 = lambda1;
        float r26346 = lambda2;
        float r26347 = r26345 - r26346;
        float r26348 = sin(r26347);
        float r26349 = phi2;
        float r26350 = cos(r26349);
        float r26351 = r26348 * r26350;
        float r26352 = phi1;
        float r26353 = cos(r26352);
        float r26354 = sin(r26349);
        float r26355 = r26353 * r26354;
        float r26356 = sin(r26352);
        float r26357 = r26356 * r26350;
        float r26358 = cos(r26347);
        float r26359 = r26357 * r26358;
        float r26360 = r26355 - r26359;
        float r26361 = atan2(r26351, r26360);
        return r26361;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r26362 = lambda1;
        double r26363 = lambda2;
        double r26364 = r26362 - r26363;
        double r26365 = sin(r26364);
        double r26366 = phi2;
        double r26367 = cos(r26366);
        double r26368 = r26365 * r26367;
        double r26369 = phi1;
        double r26370 = cos(r26369);
        double r26371 = sin(r26366);
        double r26372 = r26370 * r26371;
        double r26373 = sin(r26369);
        double r26374 = r26373 * r26367;
        double r26375 = cos(r26364);
        double r26376 = r26374 * r26375;
        double r26377 = r26372 - r26376;
        double r26378 = atan2(r26368, r26377);
        return r26378;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r26379 = lambda1;
        float r26380 = sin(r26379);
        float r26381 = lambda2;
        float r26382 = cos(r26381);
        float r26383 = r26380 * r26382;
        float r26384 = cos(r26379);
        float r26385 = -r26381;
        float r26386 = sin(r26385);
        float r26387 = r26384 * r26386;
        float r26388 = r26383 + r26387;
        float r26389 = phi2;
        float r26390 = cos(r26389);
        float r26391 = r26388 * r26390;
        float r26392 = phi1;
        float r26393 = cos(r26392);
        float r26394 = sin(r26389);
        float r26395 = r26393 * r26394;
        float r26396 = sin(r26392);
        float r26397 = r26396 * r26390;
        float r26398 = r26384 * r26382;
        float r26399 = cbrt(r26386);
        float r26400 = r26399 * r26399;
        float r26401 = r26380 * r26400;
        float r26402 = r26401 * r26399;
        float r26403 = r26398 - r26402;
        float r26404 = r26397 * r26403;
        float r26405 = r26395 - r26404;
        float r26406 = atan2(r26391, r26405);
        return r26406;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r26407 = lambda1;
        double r26408 = sin(r26407);
        double r26409 = lambda2;
        double r26410 = cos(r26409);
        double r26411 = r26408 * r26410;
        double r26412 = cos(r26407);
        double r26413 = -r26409;
        double r26414 = sin(r26413);
        double r26415 = r26412 * r26414;
        double r26416 = r26411 + r26415;
        double r26417 = phi2;
        double r26418 = cos(r26417);
        double r26419 = r26416 * r26418;
        double r26420 = phi1;
        double r26421 = cos(r26420);
        double r26422 = sin(r26417);
        double r26423 = r26421 * r26422;
        double r26424 = sin(r26420);
        double r26425 = r26424 * r26418;
        double r26426 = r26412 * r26410;
        double r26427 = cbrt(r26414);
        double r26428 = r26427 * r26427;
        double r26429 = r26408 * r26428;
        double r26430 = r26429 * r26427;
        double r26431 = r26426 - r26430;
        double r26432 = r26425 * r26431;
        double r26433 = r26423 - r26432;
        double r26434 = atan2(r26419, r26433);
        return r26434;
}

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 r26435, r26436, r26437, r26438, r26439, r26440, r26441, r26442, r26443, r26444, r26445, r26446, r26447, r26448, r26449, r26450, r26451;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26435);
        mpfr_init(r26436);
        mpfr_init(r26437);
        mpfr_init(r26438);
        mpfr_init(r26439);
        mpfr_init(r26440);
        mpfr_init(r26441);
        mpfr_init(r26442);
        mpfr_init(r26443);
        mpfr_init(r26444);
        mpfr_init(r26445);
        mpfr_init(r26446);
        mpfr_init(r26447);
        mpfr_init(r26448);
        mpfr_init(r26449);
        mpfr_init(r26450);
        mpfr_init(r26451);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26435, lambda1, MPFR_RNDN);
        mpfr_set_d(r26436, lambda2, MPFR_RNDN);
        mpfr_sub(r26437, r26435, r26436, MPFR_RNDN);
        mpfr_sin(r26438, r26437, MPFR_RNDN);
        mpfr_set_d(r26439, phi2, MPFR_RNDN);
        mpfr_cos(r26440, r26439, MPFR_RNDN);
        mpfr_mul(r26441, r26438, r26440, MPFR_RNDN);
        mpfr_set_d(r26442, phi1, MPFR_RNDN);
        mpfr_cos(r26443, r26442, MPFR_RNDN);
        mpfr_sin(r26444, r26439, MPFR_RNDN);
        mpfr_mul(r26445, r26443, r26444, MPFR_RNDN);
        mpfr_sin(r26446, r26442, MPFR_RNDN);
        mpfr_mul(r26447, r26446, r26440, MPFR_RNDN);
        mpfr_cos(r26448, r26437, MPFR_RNDN);
        mpfr_mul(r26449, r26447, r26448, MPFR_RNDN);
        mpfr_sub(r26450, r26445, r26449, MPFR_RNDN);
        mpfr_atan2(r26451, r26441, r26450, MPFR_RNDN);
        return mpfr_get_d(r26451, MPFR_RNDN);
}

static mpfr_t r26452, r26453, r26454, r26455, r26456, r26457, r26458, r26459, r26460, r26461, r26462, r26463, r26464, r26465, r26466, r26467, r26468, r26469, r26470, r26471, r26472, r26473, r26474, r26475, r26476, r26477, r26478, r26479;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26452);
        mpfr_init(r26453);
        mpfr_init(r26454);
        mpfr_init(r26455);
        mpfr_init(r26456);
        mpfr_init(r26457);
        mpfr_init(r26458);
        mpfr_init(r26459);
        mpfr_init(r26460);
        mpfr_init(r26461);
        mpfr_init(r26462);
        mpfr_init(r26463);
        mpfr_init(r26464);
        mpfr_init(r26465);
        mpfr_init(r26466);
        mpfr_init(r26467);
        mpfr_init(r26468);
        mpfr_init(r26469);
        mpfr_init(r26470);
        mpfr_init(r26471);
        mpfr_init(r26472);
        mpfr_init(r26473);
        mpfr_init(r26474);
        mpfr_init(r26475);
        mpfr_init(r26476);
        mpfr_init(r26477);
        mpfr_init(r26478);
        mpfr_init(r26479);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26452, lambda1, MPFR_RNDN);
        mpfr_sin(r26453, r26452, MPFR_RNDN);
        mpfr_set_d(r26454, lambda2, MPFR_RNDN);
        mpfr_cos(r26455, r26454, MPFR_RNDN);
        mpfr_mul(r26456, r26453, r26455, MPFR_RNDN);
        mpfr_cos(r26457, r26452, MPFR_RNDN);
        mpfr_neg(r26458, r26454, MPFR_RNDN);
        mpfr_sin(r26459, r26458, MPFR_RNDN);
        mpfr_mul(r26460, r26457, r26459, MPFR_RNDN);
        mpfr_add(r26461, r26456, r26460, MPFR_RNDN);
        mpfr_set_d(r26462, phi2, MPFR_RNDN);
        mpfr_cos(r26463, r26462, MPFR_RNDN);
        mpfr_mul(r26464, r26461, r26463, MPFR_RNDN);
        mpfr_set_d(r26465, phi1, MPFR_RNDN);
        mpfr_cos(r26466, r26465, MPFR_RNDN);
        mpfr_sin(r26467, r26462, MPFR_RNDN);
        mpfr_mul(r26468, r26466, r26467, MPFR_RNDN);
        mpfr_sin(r26469, r26465, MPFR_RNDN);
        mpfr_mul(r26470, r26469, r26463, MPFR_RNDN);
        mpfr_mul(r26471, r26457, r26455, MPFR_RNDN);
        mpfr_cbrt(r26472, r26459, MPFR_RNDN);
        mpfr_mul(r26473, r26472, r26472, MPFR_RNDN);
        mpfr_mul(r26474, r26453, r26473, MPFR_RNDN);
        mpfr_mul(r26475, r26474, r26472, MPFR_RNDN);
        mpfr_sub(r26476, r26471, r26475, MPFR_RNDN);
        mpfr_mul(r26477, r26470, r26476, MPFR_RNDN);
        mpfr_sub(r26478, r26468, r26477, MPFR_RNDN);
        mpfr_atan2(r26479, r26464, r26478, MPFR_RNDN);
        return mpfr_get_d(r26479, MPFR_RNDN);
}

static mpfr_t r26480, r26481, r26482, r26483, r26484, r26485, r26486, r26487, r26488, r26489, r26490, r26491, r26492, r26493, r26494, r26495, r26496, r26497, r26498, r26499, r26500, r26501, r26502, r26503, r26504, r26505, r26506, r26507;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26480);
        mpfr_init(r26481);
        mpfr_init(r26482);
        mpfr_init(r26483);
        mpfr_init(r26484);
        mpfr_init(r26485);
        mpfr_init(r26486);
        mpfr_init(r26487);
        mpfr_init(r26488);
        mpfr_init(r26489);
        mpfr_init(r26490);
        mpfr_init(r26491);
        mpfr_init(r26492);
        mpfr_init(r26493);
        mpfr_init(r26494);
        mpfr_init(r26495);
        mpfr_init(r26496);
        mpfr_init(r26497);
        mpfr_init(r26498);
        mpfr_init(r26499);
        mpfr_init(r26500);
        mpfr_init(r26501);
        mpfr_init(r26502);
        mpfr_init(r26503);
        mpfr_init(r26504);
        mpfr_init(r26505);
        mpfr_init(r26506);
        mpfr_init(r26507);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26480, lambda1, MPFR_RNDN);
        mpfr_sin(r26481, r26480, MPFR_RNDN);
        mpfr_set_d(r26482, lambda2, MPFR_RNDN);
        mpfr_cos(r26483, r26482, MPFR_RNDN);
        mpfr_mul(r26484, r26481, r26483, MPFR_RNDN);
        mpfr_cos(r26485, r26480, MPFR_RNDN);
        mpfr_neg(r26486, r26482, MPFR_RNDN);
        mpfr_sin(r26487, r26486, MPFR_RNDN);
        mpfr_mul(r26488, r26485, r26487, MPFR_RNDN);
        mpfr_add(r26489, r26484, r26488, MPFR_RNDN);
        mpfr_set_d(r26490, phi2, MPFR_RNDN);
        mpfr_cos(r26491, r26490, MPFR_RNDN);
        mpfr_mul(r26492, r26489, r26491, MPFR_RNDN);
        mpfr_set_d(r26493, phi1, MPFR_RNDN);
        mpfr_cos(r26494, r26493, MPFR_RNDN);
        mpfr_sin(r26495, r26490, MPFR_RNDN);
        mpfr_mul(r26496, r26494, r26495, MPFR_RNDN);
        mpfr_sin(r26497, r26493, MPFR_RNDN);
        mpfr_mul(r26498, r26497, r26491, MPFR_RNDN);
        mpfr_mul(r26499, r26485, r26483, MPFR_RNDN);
        mpfr_cbrt(r26500, r26487, MPFR_RNDN);
        mpfr_mul(r26501, r26500, r26500, MPFR_RNDN);
        mpfr_mul(r26502, r26481, r26501, MPFR_RNDN);
        mpfr_mul(r26503, r26502, r26500, MPFR_RNDN);
        mpfr_sub(r26504, r26499, r26503, MPFR_RNDN);
        mpfr_mul(r26505, r26498, r26504, MPFR_RNDN);
        mpfr_sub(r26506, r26496, r26505, MPFR_RNDN);
        mpfr_atan2(r26507, r26492, r26506, MPFR_RNDN);
        return mpfr_get_d(r26507, MPFR_RNDN);
}

