#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 r26358 = lambda1;
        float r26359 = lambda2;
        float r26360 = r26358 - r26359;
        float r26361 = sin(r26360);
        float r26362 = phi2;
        float r26363 = cos(r26362);
        float r26364 = r26361 * r26363;
        float r26365 = phi1;
        float r26366 = cos(r26365);
        float r26367 = sin(r26362);
        float r26368 = r26366 * r26367;
        float r26369 = sin(r26365);
        float r26370 = r26369 * r26363;
        float r26371 = cos(r26360);
        float r26372 = r26370 * r26371;
        float r26373 = r26368 - r26372;
        float r26374 = atan2(r26364, r26373);
        return r26374;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r26375 = lambda1;
        double r26376 = lambda2;
        double r26377 = r26375 - r26376;
        double r26378 = sin(r26377);
        double r26379 = phi2;
        double r26380 = cos(r26379);
        double r26381 = r26378 * r26380;
        double r26382 = phi1;
        double r26383 = cos(r26382);
        double r26384 = sin(r26379);
        double r26385 = r26383 * r26384;
        double r26386 = sin(r26382);
        double r26387 = r26386 * r26380;
        double r26388 = cos(r26377);
        double r26389 = r26387 * r26388;
        double r26390 = r26385 - r26389;
        double r26391 = atan2(r26381, r26390);
        return r26391;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r26392 = lambda1;
        float r26393 = sin(r26392);
        float r26394 = lambda2;
        float r26395 = cos(r26394);
        float r26396 = r26393 * r26395;
        float r26397 = cos(r26392);
        float r26398 = -r26394;
        float r26399 = sin(r26398);
        float r26400 = r26397 * r26399;
        float r26401 = r26396 + r26400;
        float r26402 = phi2;
        float r26403 = cos(r26402);
        float r26404 = r26401 * r26403;
        float r26405 = phi1;
        float r26406 = cos(r26405);
        float r26407 = sin(r26402);
        float r26408 = r26406 * r26407;
        float r26409 = sin(r26405);
        float r26410 = r26409 * r26403;
        float r26411 = r26397 * r26395;
        float r26412 = r26410 * r26411;
        float r26413 = sin(r26394);
        float r26414 = r26393 * r26413;
        float r26415 = r26410 * r26414;
        float r26416 = expm1(r26415);
        float r26417 = log1p(r26416);
        float r26418 = r26412 + r26417;
        float r26419 = r26408 - r26418;
        float r26420 = atan2(r26404, r26419);
        return r26420;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r26421 = lambda1;
        double r26422 = sin(r26421);
        double r26423 = lambda2;
        double r26424 = cos(r26423);
        double r26425 = r26422 * r26424;
        double r26426 = cos(r26421);
        double r26427 = -r26423;
        double r26428 = sin(r26427);
        double r26429 = r26426 * r26428;
        double r26430 = r26425 + r26429;
        double r26431 = phi2;
        double r26432 = cos(r26431);
        double r26433 = r26430 * r26432;
        double r26434 = phi1;
        double r26435 = cos(r26434);
        double r26436 = sin(r26431);
        double r26437 = r26435 * r26436;
        double r26438 = sin(r26434);
        double r26439 = r26438 * r26432;
        double r26440 = r26426 * r26424;
        double r26441 = r26439 * r26440;
        double r26442 = sin(r26423);
        double r26443 = r26422 * r26442;
        double r26444 = r26439 * r26443;
        double r26445 = expm1(r26444);
        double r26446 = log1p(r26445);
        double r26447 = r26441 + r26446;
        double r26448 = r26437 - r26447;
        double r26449 = atan2(r26433, r26448);
        return r26449;
}

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 r26450, r26451, r26452, r26453, r26454, r26455, r26456, r26457, r26458, r26459, r26460, r26461, r26462, r26463, r26464, r26465, r26466;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r26450);
        mpfr_init(r26451);
        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);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26450, lambda1, MPFR_RNDN);
        mpfr_set_d(r26451, lambda2, MPFR_RNDN);
        mpfr_sub(r26452, r26450, r26451, MPFR_RNDN);
        mpfr_sin(r26453, r26452, MPFR_RNDN);
        mpfr_set_d(r26454, phi2, MPFR_RNDN);
        mpfr_cos(r26455, r26454, MPFR_RNDN);
        mpfr_mul(r26456, r26453, r26455, MPFR_RNDN);
        mpfr_set_d(r26457, phi1, MPFR_RNDN);
        mpfr_cos(r26458, r26457, MPFR_RNDN);
        mpfr_sin(r26459, r26454, MPFR_RNDN);
        mpfr_mul(r26460, r26458, r26459, MPFR_RNDN);
        mpfr_sin(r26461, r26457, MPFR_RNDN);
        mpfr_mul(r26462, r26461, r26455, MPFR_RNDN);
        mpfr_cos(r26463, r26452, MPFR_RNDN);
        mpfr_mul(r26464, r26462, r26463, MPFR_RNDN);
        mpfr_sub(r26465, r26460, r26464, MPFR_RNDN);
        mpfr_atan2(r26466, r26456, r26465, MPFR_RNDN);
        return mpfr_get_d(r26466, MPFR_RNDN);
}

static mpfr_t r26467, r26468, r26469, r26470, r26471, r26472, r26473, r26474, r26475, r26476, r26477, r26478, r26479, r26480, r26481, r26482, r26483, r26484, r26485, r26486, r26487, r26488, r26489, r26490, r26491, r26492, r26493, r26494, r26495;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        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);
        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);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26467, lambda1, MPFR_RNDN);
        mpfr_sin(r26468, r26467, MPFR_RNDN);
        mpfr_set_d(r26469, lambda2, MPFR_RNDN);
        mpfr_cos(r26470, r26469, MPFR_RNDN);
        mpfr_mul(r26471, r26468, r26470, MPFR_RNDN);
        mpfr_cos(r26472, r26467, MPFR_RNDN);
        mpfr_neg(r26473, r26469, MPFR_RNDN);
        mpfr_sin(r26474, r26473, MPFR_RNDN);
        mpfr_mul(r26475, r26472, r26474, MPFR_RNDN);
        mpfr_add(r26476, r26471, r26475, MPFR_RNDN);
        mpfr_set_d(r26477, phi2, MPFR_RNDN);
        mpfr_cos(r26478, r26477, MPFR_RNDN);
        mpfr_mul(r26479, r26476, r26478, MPFR_RNDN);
        mpfr_set_d(r26480, phi1, MPFR_RNDN);
        mpfr_cos(r26481, r26480, MPFR_RNDN);
        mpfr_sin(r26482, r26477, MPFR_RNDN);
        mpfr_mul(r26483, r26481, r26482, MPFR_RNDN);
        mpfr_sin(r26484, r26480, MPFR_RNDN);
        mpfr_mul(r26485, r26484, r26478, MPFR_RNDN);
        mpfr_mul(r26486, r26472, r26470, MPFR_RNDN);
        mpfr_mul(r26487, r26485, r26486, MPFR_RNDN);
        mpfr_sin(r26488, r26469, MPFR_RNDN);
        mpfr_mul(r26489, r26468, r26488, MPFR_RNDN);
        mpfr_mul(r26490, r26485, r26489, MPFR_RNDN);
        mpfr_expm1(r26491, r26490, MPFR_RNDN);
        mpfr_log1p(r26492, r26491, MPFR_RNDN);
        mpfr_add(r26493, r26487, r26492, MPFR_RNDN);
        mpfr_sub(r26494, r26483, r26493, MPFR_RNDN);
        mpfr_atan2(r26495, r26479, r26494, MPFR_RNDN);
        return mpfr_get_d(r26495, MPFR_RNDN);
}

static mpfr_t r26496, r26497, r26498, r26499, r26500, r26501, r26502, r26503, r26504, r26505, r26506, r26507, r26508, r26509, r26510, r26511, r26512, r26513, r26514, r26515, r26516, r26517, r26518, r26519, r26520, r26521, r26522, r26523, r26524;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        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);
        mpfr_init(r26508);
        mpfr_init(r26509);
        mpfr_init(r26510);
        mpfr_init(r26511);
        mpfr_init(r26512);
        mpfr_init(r26513);
        mpfr_init(r26514);
        mpfr_init(r26515);
        mpfr_init(r26516);
        mpfr_init(r26517);
        mpfr_init(r26518);
        mpfr_init(r26519);
        mpfr_init(r26520);
        mpfr_init(r26521);
        mpfr_init(r26522);
        mpfr_init(r26523);
        mpfr_init(r26524);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r26496, lambda1, MPFR_RNDN);
        mpfr_sin(r26497, r26496, MPFR_RNDN);
        mpfr_set_d(r26498, lambda2, MPFR_RNDN);
        mpfr_cos(r26499, r26498, MPFR_RNDN);
        mpfr_mul(r26500, r26497, r26499, MPFR_RNDN);
        mpfr_cos(r26501, r26496, MPFR_RNDN);
        mpfr_neg(r26502, r26498, MPFR_RNDN);
        mpfr_sin(r26503, r26502, MPFR_RNDN);
        mpfr_mul(r26504, r26501, r26503, MPFR_RNDN);
        mpfr_add(r26505, r26500, r26504, MPFR_RNDN);
        mpfr_set_d(r26506, phi2, MPFR_RNDN);
        mpfr_cos(r26507, r26506, MPFR_RNDN);
        mpfr_mul(r26508, r26505, r26507, MPFR_RNDN);
        mpfr_set_d(r26509, phi1, MPFR_RNDN);
        mpfr_cos(r26510, r26509, MPFR_RNDN);
        mpfr_sin(r26511, r26506, MPFR_RNDN);
        mpfr_mul(r26512, r26510, r26511, MPFR_RNDN);
        mpfr_sin(r26513, r26509, MPFR_RNDN);
        mpfr_mul(r26514, r26513, r26507, MPFR_RNDN);
        mpfr_mul(r26515, r26501, r26499, MPFR_RNDN);
        mpfr_mul(r26516, r26514, r26515, MPFR_RNDN);
        mpfr_sin(r26517, r26498, MPFR_RNDN);
        mpfr_mul(r26518, r26497, r26517, MPFR_RNDN);
        mpfr_mul(r26519, r26514, r26518, MPFR_RNDN);
        mpfr_expm1(r26520, r26519, MPFR_RNDN);
        mpfr_log1p(r26521, r26520, MPFR_RNDN);
        mpfr_add(r26522, r26516, r26521, MPFR_RNDN);
        mpfr_sub(r26523, r26512, r26522, MPFR_RNDN);
        mpfr_atan2(r26524, r26508, r26523, MPFR_RNDN);
        return mpfr_get_d(r26524, MPFR_RNDN);
}

