#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 r10347 = lambda1;
        float r10348 = lambda2;
        float r10349 = r10347 - r10348;
        float r10350 = sin(r10349);
        float r10351 = phi2;
        float r10352 = cos(r10351);
        float r10353 = r10350 * r10352;
        float r10354 = phi1;
        float r10355 = cos(r10354);
        float r10356 = sin(r10351);
        float r10357 = r10355 * r10356;
        float r10358 = sin(r10354);
        float r10359 = r10358 * r10352;
        float r10360 = cos(r10349);
        float r10361 = r10359 * r10360;
        float r10362 = r10357 - r10361;
        float r10363 = atan2(r10353, r10362);
        return r10363;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r10364 = lambda1;
        double r10365 = lambda2;
        double r10366 = r10364 - r10365;
        double r10367 = sin(r10366);
        double r10368 = phi2;
        double r10369 = cos(r10368);
        double r10370 = r10367 * r10369;
        double r10371 = phi1;
        double r10372 = cos(r10371);
        double r10373 = sin(r10368);
        double r10374 = r10372 * r10373;
        double r10375 = sin(r10371);
        double r10376 = r10375 * r10369;
        double r10377 = cos(r10366);
        double r10378 = r10376 * r10377;
        double r10379 = r10374 - r10378;
        double r10380 = atan2(r10370, r10379);
        return r10380;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r10381 = lambda2;
        float r10382 = cos(r10381);
        float r10383 = lambda1;
        float r10384 = sin(r10383);
        float r10385 = r10382 * r10384;
        float r10386 = cos(r10383);
        float r10387 = -r10381;
        float r10388 = sin(r10387);
        float r10389 = r10386 * r10388;
        float r10390 = r10385 + r10389;
        float r10391 = phi2;
        float r10392 = cos(r10391);
        float r10393 = r10390 * r10392;
        float r10394 = phi1;
        float r10395 = cos(r10394);
        float r10396 = sin(r10391);
        float r10397 = r10395 * r10396;
        float r10398 = sin(r10394);
        float r10399 = r10398 * r10392;
        float r10400 = r10382 * r10386;
        float r10401 = r10384 * r10388;
        float r10402 = r10400 - r10401;
        float r10403 = r10399 * r10402;
        float r10404 = r10397 - r10403;
        float r10405 = atan2(r10393, r10404);
        return r10405;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r10406 = lambda2;
        double r10407 = cos(r10406);
        double r10408 = lambda1;
        double r10409 = sin(r10408);
        double r10410 = r10407 * r10409;
        double r10411 = cos(r10408);
        double r10412 = -r10406;
        double r10413 = sin(r10412);
        double r10414 = r10411 * r10413;
        double r10415 = r10410 + r10414;
        double r10416 = phi2;
        double r10417 = cos(r10416);
        double r10418 = r10415 * r10417;
        double r10419 = phi1;
        double r10420 = cos(r10419);
        double r10421 = sin(r10416);
        double r10422 = r10420 * r10421;
        double r10423 = sin(r10419);
        double r10424 = r10423 * r10417;
        double r10425 = r10407 * r10411;
        double r10426 = r10409 * r10413;
        double r10427 = r10425 - r10426;
        double r10428 = r10424 * r10427;
        double r10429 = r10422 - r10428;
        double r10430 = atan2(r10418, r10429);
        return r10430;
}

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 r10431, r10432, r10433, r10434, r10435, r10436, r10437, r10438, r10439, r10440, r10441, r10442, r10443, r10444, r10445, r10446, r10447;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10431);
        mpfr_init(r10432);
        mpfr_init(r10433);
        mpfr_init(r10434);
        mpfr_init(r10435);
        mpfr_init(r10436);
        mpfr_init(r10437);
        mpfr_init(r10438);
        mpfr_init(r10439);
        mpfr_init(r10440);
        mpfr_init(r10441);
        mpfr_init(r10442);
        mpfr_init(r10443);
        mpfr_init(r10444);
        mpfr_init(r10445);
        mpfr_init(r10446);
        mpfr_init(r10447);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10431, lambda1, MPFR_RNDN);
        mpfr_set_d(r10432, lambda2, MPFR_RNDN);
        mpfr_sub(r10433, r10431, r10432, MPFR_RNDN);
        mpfr_sin(r10434, r10433, MPFR_RNDN);
        mpfr_set_d(r10435, phi2, MPFR_RNDN);
        mpfr_cos(r10436, r10435, MPFR_RNDN);
        mpfr_mul(r10437, r10434, r10436, MPFR_RNDN);
        mpfr_set_d(r10438, phi1, MPFR_RNDN);
        mpfr_cos(r10439, r10438, MPFR_RNDN);
        mpfr_sin(r10440, r10435, MPFR_RNDN);
        mpfr_mul(r10441, r10439, r10440, MPFR_RNDN);
        mpfr_sin(r10442, r10438, MPFR_RNDN);
        mpfr_mul(r10443, r10442, r10436, MPFR_RNDN);
        mpfr_cos(r10444, r10433, MPFR_RNDN);
        mpfr_mul(r10445, r10443, r10444, MPFR_RNDN);
        mpfr_sub(r10446, r10441, r10445, MPFR_RNDN);
        mpfr_atan2(r10447, r10437, r10446, MPFR_RNDN);
        return mpfr_get_d(r10447, MPFR_RNDN);
}

static mpfr_t r10448, r10449, r10450, r10451, r10452, r10453, r10454, r10455, r10456, r10457, r10458, r10459, r10460, r10461, r10462, r10463, r10464, r10465, r10466, r10467, r10468, r10469, r10470, r10471, r10472;

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

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10448, lambda2, MPFR_RNDN);
        mpfr_cos(r10449, r10448, MPFR_RNDN);
        mpfr_set_d(r10450, lambda1, MPFR_RNDN);
        mpfr_sin(r10451, r10450, MPFR_RNDN);
        mpfr_mul(r10452, r10449, r10451, MPFR_RNDN);
        mpfr_cos(r10453, r10450, MPFR_RNDN);
        mpfr_neg(r10454, r10448, MPFR_RNDN);
        mpfr_sin(r10455, r10454, MPFR_RNDN);
        mpfr_mul(r10456, r10453, r10455, MPFR_RNDN);
        mpfr_add(r10457, r10452, r10456, MPFR_RNDN);
        mpfr_set_d(r10458, phi2, MPFR_RNDN);
        mpfr_cos(r10459, r10458, MPFR_RNDN);
        mpfr_mul(r10460, r10457, r10459, MPFR_RNDN);
        mpfr_set_d(r10461, phi1, MPFR_RNDN);
        mpfr_cos(r10462, r10461, MPFR_RNDN);
        mpfr_sin(r10463, r10458, MPFR_RNDN);
        mpfr_mul(r10464, r10462, r10463, MPFR_RNDN);
        mpfr_sin(r10465, r10461, MPFR_RNDN);
        mpfr_mul(r10466, r10465, r10459, MPFR_RNDN);
        mpfr_mul(r10467, r10449, r10453, MPFR_RNDN);
        mpfr_mul(r10468, r10451, r10455, MPFR_RNDN);
        mpfr_sub(r10469, r10467, r10468, MPFR_RNDN);
        mpfr_mul(r10470, r10466, r10469, MPFR_RNDN);
        mpfr_sub(r10471, r10464, r10470, MPFR_RNDN);
        mpfr_atan2(r10472, r10460, r10471, MPFR_RNDN);
        return mpfr_get_d(r10472, MPFR_RNDN);
}

static mpfr_t r10473, r10474, r10475, r10476, r10477, r10478, r10479, r10480, r10481, r10482, r10483, r10484, r10485, r10486, r10487, r10488, r10489, r10490, r10491, r10492, r10493, r10494, r10495, r10496, r10497;

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

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10473, lambda2, MPFR_RNDN);
        mpfr_cos(r10474, r10473, MPFR_RNDN);
        mpfr_set_d(r10475, lambda1, MPFR_RNDN);
        mpfr_sin(r10476, r10475, MPFR_RNDN);
        mpfr_mul(r10477, r10474, r10476, MPFR_RNDN);
        mpfr_cos(r10478, r10475, MPFR_RNDN);
        mpfr_neg(r10479, r10473, MPFR_RNDN);
        mpfr_sin(r10480, r10479, MPFR_RNDN);
        mpfr_mul(r10481, r10478, r10480, MPFR_RNDN);
        mpfr_add(r10482, r10477, r10481, MPFR_RNDN);
        mpfr_set_d(r10483, phi2, MPFR_RNDN);
        mpfr_cos(r10484, r10483, MPFR_RNDN);
        mpfr_mul(r10485, r10482, r10484, MPFR_RNDN);
        mpfr_set_d(r10486, phi1, MPFR_RNDN);
        mpfr_cos(r10487, r10486, MPFR_RNDN);
        mpfr_sin(r10488, r10483, MPFR_RNDN);
        mpfr_mul(r10489, r10487, r10488, MPFR_RNDN);
        mpfr_sin(r10490, r10486, MPFR_RNDN);
        mpfr_mul(r10491, r10490, r10484, MPFR_RNDN);
        mpfr_mul(r10492, r10474, r10478, MPFR_RNDN);
        mpfr_mul(r10493, r10476, r10480, MPFR_RNDN);
        mpfr_sub(r10494, r10492, r10493, MPFR_RNDN);
        mpfr_mul(r10495, r10491, r10494, MPFR_RNDN);
        mpfr_sub(r10496, r10489, r10495, MPFR_RNDN);
        mpfr_atan2(r10497, r10485, r10496, MPFR_RNDN);
        return mpfr_get_d(r10497, MPFR_RNDN);
}

