#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 r10356 = lambda1;
        float r10357 = lambda2;
        float r10358 = r10356 - r10357;
        float r10359 = sin(r10358);
        float r10360 = phi2;
        float r10361 = cos(r10360);
        float r10362 = r10359 * r10361;
        float r10363 = phi1;
        float r10364 = cos(r10363);
        float r10365 = sin(r10360);
        float r10366 = r10364 * r10365;
        float r10367 = sin(r10363);
        float r10368 = r10367 * r10361;
        float r10369 = cos(r10358);
        float r10370 = r10368 * r10369;
        float r10371 = r10366 - r10370;
        float r10372 = atan2(r10362, r10371);
        return r10372;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r10373 = lambda1;
        double r10374 = lambda2;
        double r10375 = r10373 - r10374;
        double r10376 = sin(r10375);
        double r10377 = phi2;
        double r10378 = cos(r10377);
        double r10379 = r10376 * r10378;
        double r10380 = phi1;
        double r10381 = cos(r10380);
        double r10382 = sin(r10377);
        double r10383 = r10381 * r10382;
        double r10384 = sin(r10380);
        double r10385 = r10384 * r10378;
        double r10386 = cos(r10375);
        double r10387 = r10385 * r10386;
        double r10388 = r10383 - r10387;
        double r10389 = atan2(r10379, r10388);
        return r10389;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r10390 = lambda2;
        float r10391 = cos(r10390);
        float r10392 = lambda1;
        float r10393 = sin(r10392);
        float r10394 = r10391 * r10393;
        float r10395 = cos(r10392);
        float r10396 = -r10390;
        float r10397 = sin(r10396);
        float r10398 = r10395 * r10397;
        float r10399 = r10394 + r10398;
        float r10400 = phi2;
        float r10401 = cos(r10400);
        float r10402 = r10399 * r10401;
        float r10403 = phi1;
        float r10404 = cos(r10403);
        float r10405 = sin(r10400);
        float r10406 = r10404 * r10405;
        float r10407 = sin(r10403);
        float r10408 = r10407 * r10401;
        float r10409 = r10391 * r10395;
        float r10410 = r10393 * r10397;
        float r10411 = r10409 - r10410;
        float r10412 = r10408 * r10411;
        float r10413 = r10406 - r10412;
        float r10414 = atan2(r10402, r10413);
        return r10414;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r10415 = lambda2;
        double r10416 = cos(r10415);
        double r10417 = lambda1;
        double r10418 = sin(r10417);
        double r10419 = r10416 * r10418;
        double r10420 = cos(r10417);
        double r10421 = -r10415;
        double r10422 = sin(r10421);
        double r10423 = r10420 * r10422;
        double r10424 = r10419 + r10423;
        double r10425 = phi2;
        double r10426 = cos(r10425);
        double r10427 = r10424 * r10426;
        double r10428 = phi1;
        double r10429 = cos(r10428);
        double r10430 = sin(r10425);
        double r10431 = r10429 * r10430;
        double r10432 = sin(r10428);
        double r10433 = r10432 * r10426;
        double r10434 = r10416 * r10420;
        double r10435 = r10418 * r10422;
        double r10436 = r10434 - r10435;
        double r10437 = r10433 * r10436;
        double r10438 = r10431 - r10437;
        double r10439 = atan2(r10427, r10438);
        return r10439;
}

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 r10440, r10441, r10442, r10443, r10444, r10445, r10446, r10447, r10448, r10449, r10450, r10451, r10452, r10453, r10454, r10455, r10456;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10440);
        mpfr_init(r10441);
        mpfr_init(r10442);
        mpfr_init(r10443);
        mpfr_init(r10444);
        mpfr_init(r10445);
        mpfr_init(r10446);
        mpfr_init(r10447);
        mpfr_init(r10448);
        mpfr_init(r10449);
        mpfr_init(r10450);
        mpfr_init(r10451);
        mpfr_init(r10452);
        mpfr_init(r10453);
        mpfr_init(r10454);
        mpfr_init(r10455);
        mpfr_init(r10456);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10440, lambda1, MPFR_RNDN);
        mpfr_set_d(r10441, lambda2, MPFR_RNDN);
        mpfr_sub(r10442, r10440, r10441, MPFR_RNDN);
        mpfr_sin(r10443, r10442, MPFR_RNDN);
        mpfr_set_d(r10444, phi2, MPFR_RNDN);
        mpfr_cos(r10445, r10444, MPFR_RNDN);
        mpfr_mul(r10446, r10443, r10445, MPFR_RNDN);
        mpfr_set_d(r10447, phi1, MPFR_RNDN);
        mpfr_cos(r10448, r10447, MPFR_RNDN);
        mpfr_sin(r10449, r10444, MPFR_RNDN);
        mpfr_mul(r10450, r10448, r10449, MPFR_RNDN);
        mpfr_sin(r10451, r10447, MPFR_RNDN);
        mpfr_mul(r10452, r10451, r10445, MPFR_RNDN);
        mpfr_cos(r10453, r10442, MPFR_RNDN);
        mpfr_mul(r10454, r10452, r10453, MPFR_RNDN);
        mpfr_sub(r10455, r10450, r10454, MPFR_RNDN);
        mpfr_atan2(r10456, r10446, r10455, MPFR_RNDN);
        return mpfr_get_d(r10456, MPFR_RNDN);
}

static mpfr_t r10457, r10458, r10459, r10460, r10461, r10462, r10463, r10464, r10465, r10466, r10467, r10468, r10469, r10470, r10471, r10472, r10473, r10474, r10475, r10476, r10477, r10478, r10479, r10480, r10481;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10457);
        mpfr_init(r10458);
        mpfr_init(r10459);
        mpfr_init(r10460);
        mpfr_init(r10461);
        mpfr_init(r10462);
        mpfr_init(r10463);
        mpfr_init(r10464);
        mpfr_init(r10465);
        mpfr_init(r10466);
        mpfr_init(r10467);
        mpfr_init(r10468);
        mpfr_init(r10469);
        mpfr_init(r10470);
        mpfr_init(r10471);
        mpfr_init(r10472);
        mpfr_init(r10473);
        mpfr_init(r10474);
        mpfr_init(r10475);
        mpfr_init(r10476);
        mpfr_init(r10477);
        mpfr_init(r10478);
        mpfr_init(r10479);
        mpfr_init(r10480);
        mpfr_init(r10481);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10457, lambda2, MPFR_RNDN);
        mpfr_cos(r10458, r10457, MPFR_RNDN);
        mpfr_set_d(r10459, lambda1, MPFR_RNDN);
        mpfr_sin(r10460, r10459, MPFR_RNDN);
        mpfr_mul(r10461, r10458, r10460, MPFR_RNDN);
        mpfr_cos(r10462, r10459, MPFR_RNDN);
        mpfr_neg(r10463, r10457, MPFR_RNDN);
        mpfr_sin(r10464, r10463, MPFR_RNDN);
        mpfr_mul(r10465, r10462, r10464, MPFR_RNDN);
        mpfr_add(r10466, r10461, r10465, MPFR_RNDN);
        mpfr_set_d(r10467, phi2, MPFR_RNDN);
        mpfr_cos(r10468, r10467, MPFR_RNDN);
        mpfr_mul(r10469, r10466, r10468, MPFR_RNDN);
        mpfr_set_d(r10470, phi1, MPFR_RNDN);
        mpfr_cos(r10471, r10470, MPFR_RNDN);
        mpfr_sin(r10472, r10467, MPFR_RNDN);
        mpfr_mul(r10473, r10471, r10472, MPFR_RNDN);
        mpfr_sin(r10474, r10470, MPFR_RNDN);
        mpfr_mul(r10475, r10474, r10468, MPFR_RNDN);
        mpfr_mul(r10476, r10458, r10462, MPFR_RNDN);
        mpfr_mul(r10477, r10460, r10464, MPFR_RNDN);
        mpfr_sub(r10478, r10476, r10477, MPFR_RNDN);
        mpfr_mul(r10479, r10475, r10478, MPFR_RNDN);
        mpfr_sub(r10480, r10473, r10479, MPFR_RNDN);
        mpfr_atan2(r10481, r10469, r10480, MPFR_RNDN);
        return mpfr_get_d(r10481, MPFR_RNDN);
}

static mpfr_t r10482, r10483, r10484, r10485, r10486, r10487, r10488, r10489, r10490, r10491, r10492, r10493, r10494, r10495, r10496, r10497, r10498, r10499, r10500, r10501, r10502, r10503, r10504, r10505, r10506;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10482);
        mpfr_init(r10483);
        mpfr_init(r10484);
        mpfr_init(r10485);
        mpfr_init(r10486);
        mpfr_init(r10487);
        mpfr_init(r10488);
        mpfr_init(r10489);
        mpfr_init(r10490);
        mpfr_init(r10491);
        mpfr_init(r10492);
        mpfr_init(r10493);
        mpfr_init(r10494);
        mpfr_init(r10495);
        mpfr_init(r10496);
        mpfr_init(r10497);
        mpfr_init(r10498);
        mpfr_init(r10499);
        mpfr_init(r10500);
        mpfr_init(r10501);
        mpfr_init(r10502);
        mpfr_init(r10503);
        mpfr_init(r10504);
        mpfr_init(r10505);
        mpfr_init(r10506);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10482, lambda2, MPFR_RNDN);
        mpfr_cos(r10483, r10482, MPFR_RNDN);
        mpfr_set_d(r10484, lambda1, MPFR_RNDN);
        mpfr_sin(r10485, r10484, MPFR_RNDN);
        mpfr_mul(r10486, r10483, r10485, MPFR_RNDN);
        mpfr_cos(r10487, r10484, MPFR_RNDN);
        mpfr_neg(r10488, r10482, MPFR_RNDN);
        mpfr_sin(r10489, r10488, MPFR_RNDN);
        mpfr_mul(r10490, r10487, r10489, MPFR_RNDN);
        mpfr_add(r10491, r10486, r10490, MPFR_RNDN);
        mpfr_set_d(r10492, phi2, MPFR_RNDN);
        mpfr_cos(r10493, r10492, MPFR_RNDN);
        mpfr_mul(r10494, r10491, r10493, MPFR_RNDN);
        mpfr_set_d(r10495, phi1, MPFR_RNDN);
        mpfr_cos(r10496, r10495, MPFR_RNDN);
        mpfr_sin(r10497, r10492, MPFR_RNDN);
        mpfr_mul(r10498, r10496, r10497, MPFR_RNDN);
        mpfr_sin(r10499, r10495, MPFR_RNDN);
        mpfr_mul(r10500, r10499, r10493, MPFR_RNDN);
        mpfr_mul(r10501, r10483, r10487, MPFR_RNDN);
        mpfr_mul(r10502, r10485, r10489, MPFR_RNDN);
        mpfr_sub(r10503, r10501, r10502, MPFR_RNDN);
        mpfr_mul(r10504, r10500, r10503, MPFR_RNDN);
        mpfr_sub(r10505, r10498, r10504, MPFR_RNDN);
        mpfr_atan2(r10506, r10494, r10505, MPFR_RNDN);
        return mpfr_get_d(r10506, MPFR_RNDN);
}

