#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 r10221 = lambda1;
        float r10222 = lambda2;
        float r10223 = r10221 - r10222;
        float r10224 = sin(r10223);
        float r10225 = phi2;
        float r10226 = cos(r10225);
        float r10227 = r10224 * r10226;
        float r10228 = phi1;
        float r10229 = cos(r10228);
        float r10230 = sin(r10225);
        float r10231 = r10229 * r10230;
        float r10232 = sin(r10228);
        float r10233 = r10232 * r10226;
        float r10234 = cos(r10223);
        float r10235 = r10233 * r10234;
        float r10236 = r10231 - r10235;
        float r10237 = atan2(r10227, r10236);
        return r10237;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r10238 = lambda1;
        double r10239 = lambda2;
        double r10240 = r10238 - r10239;
        double r10241 = sin(r10240);
        double r10242 = phi2;
        double r10243 = cos(r10242);
        double r10244 = r10241 * r10243;
        double r10245 = phi1;
        double r10246 = cos(r10245);
        double r10247 = sin(r10242);
        double r10248 = r10246 * r10247;
        double r10249 = sin(r10245);
        double r10250 = r10249 * r10243;
        double r10251 = cos(r10240);
        double r10252 = r10250 * r10251;
        double r10253 = r10248 - r10252;
        double r10254 = atan2(r10244, r10253);
        return r10254;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r10255 = lambda1;
        float r10256 = sin(r10255);
        float r10257 = lambda2;
        float r10258 = cos(r10257);
        float r10259 = r10256 * r10258;
        float r10260 = cos(r10255);
        float r10261 = -r10257;
        float r10262 = sin(r10261);
        float r10263 = r10260 * r10262;
        float r10264 = r10259 + r10263;
        float r10265 = phi2;
        float r10266 = cos(r10265);
        float r10267 = r10264 * r10266;
        float r10268 = phi1;
        float r10269 = cos(r10268);
        float r10270 = sin(r10265);
        float r10271 = r10269 * r10270;
        float r10272 = sin(r10268);
        float r10273 = r10272 * r10266;
        float r10274 = r10260 * r10258;
        float r10275 = r10256 * r10262;
        float r10276 = cbrt(r10275);
        float r10277 = r10276 * r10276;
        float r10278 = r10277 * r10276;
        float r10279 = r10274 - r10278;
        float r10280 = r10273 * r10279;
        float r10281 = r10271 - r10280;
        float r10282 = atan2(r10267, r10281);
        return r10282;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r10283 = lambda1;
        double r10284 = sin(r10283);
        double r10285 = lambda2;
        double r10286 = cos(r10285);
        double r10287 = r10284 * r10286;
        double r10288 = cos(r10283);
        double r10289 = -r10285;
        double r10290 = sin(r10289);
        double r10291 = r10288 * r10290;
        double r10292 = r10287 + r10291;
        double r10293 = phi2;
        double r10294 = cos(r10293);
        double r10295 = r10292 * r10294;
        double r10296 = phi1;
        double r10297 = cos(r10296);
        double r10298 = sin(r10293);
        double r10299 = r10297 * r10298;
        double r10300 = sin(r10296);
        double r10301 = r10300 * r10294;
        double r10302 = r10288 * r10286;
        double r10303 = r10284 * r10290;
        double r10304 = cbrt(r10303);
        double r10305 = r10304 * r10304;
        double r10306 = r10305 * r10304;
        double r10307 = r10302 - r10306;
        double r10308 = r10301 * r10307;
        double r10309 = r10299 - r10308;
        double r10310 = atan2(r10295, r10309);
        return r10310;
}

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 r10311, r10312, r10313, r10314, r10315, r10316, r10317, r10318, r10319, r10320, r10321, r10322, r10323, r10324, r10325, r10326, r10327;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10311);
        mpfr_init(r10312);
        mpfr_init(r10313);
        mpfr_init(r10314);
        mpfr_init(r10315);
        mpfr_init(r10316);
        mpfr_init(r10317);
        mpfr_init(r10318);
        mpfr_init(r10319);
        mpfr_init(r10320);
        mpfr_init(r10321);
        mpfr_init(r10322);
        mpfr_init(r10323);
        mpfr_init(r10324);
        mpfr_init(r10325);
        mpfr_init(r10326);
        mpfr_init(r10327);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10311, lambda1, MPFR_RNDN);
        mpfr_set_d(r10312, lambda2, MPFR_RNDN);
        mpfr_sub(r10313, r10311, r10312, MPFR_RNDN);
        mpfr_sin(r10314, r10313, MPFR_RNDN);
        mpfr_set_d(r10315, phi2, MPFR_RNDN);
        mpfr_cos(r10316, r10315, MPFR_RNDN);
        mpfr_mul(r10317, r10314, r10316, MPFR_RNDN);
        mpfr_set_d(r10318, phi1, MPFR_RNDN);
        mpfr_cos(r10319, r10318, MPFR_RNDN);
        mpfr_sin(r10320, r10315, MPFR_RNDN);
        mpfr_mul(r10321, r10319, r10320, MPFR_RNDN);
        mpfr_sin(r10322, r10318, MPFR_RNDN);
        mpfr_mul(r10323, r10322, r10316, MPFR_RNDN);
        mpfr_cos(r10324, r10313, MPFR_RNDN);
        mpfr_mul(r10325, r10323, r10324, MPFR_RNDN);
        mpfr_sub(r10326, r10321, r10325, MPFR_RNDN);
        mpfr_atan2(r10327, r10317, r10326, MPFR_RNDN);
        return mpfr_get_d(r10327, MPFR_RNDN);
}

static mpfr_t r10328, r10329, r10330, r10331, r10332, r10333, r10334, r10335, r10336, r10337, r10338, r10339, r10340, r10341, r10342, r10343, r10344, r10345, r10346, r10347, r10348, r10349, r10350, r10351, r10352, r10353, r10354, r10355;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10328);
        mpfr_init(r10329);
        mpfr_init(r10330);
        mpfr_init(r10331);
        mpfr_init(r10332);
        mpfr_init(r10333);
        mpfr_init(r10334);
        mpfr_init(r10335);
        mpfr_init(r10336);
        mpfr_init(r10337);
        mpfr_init(r10338);
        mpfr_init(r10339);
        mpfr_init(r10340);
        mpfr_init(r10341);
        mpfr_init(r10342);
        mpfr_init(r10343);
        mpfr_init(r10344);
        mpfr_init(r10345);
        mpfr_init(r10346);
        mpfr_init(r10347);
        mpfr_init(r10348);
        mpfr_init(r10349);
        mpfr_init(r10350);
        mpfr_init(r10351);
        mpfr_init(r10352);
        mpfr_init(r10353);
        mpfr_init(r10354);
        mpfr_init(r10355);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10328, lambda1, MPFR_RNDN);
        mpfr_sin(r10329, r10328, MPFR_RNDN);
        mpfr_set_d(r10330, lambda2, MPFR_RNDN);
        mpfr_cos(r10331, r10330, MPFR_RNDN);
        mpfr_mul(r10332, r10329, r10331, MPFR_RNDN);
        mpfr_cos(r10333, r10328, MPFR_RNDN);
        mpfr_neg(r10334, r10330, MPFR_RNDN);
        mpfr_sin(r10335, r10334, MPFR_RNDN);
        mpfr_mul(r10336, r10333, r10335, MPFR_RNDN);
        mpfr_add(r10337, r10332, r10336, MPFR_RNDN);
        mpfr_set_d(r10338, phi2, MPFR_RNDN);
        mpfr_cos(r10339, r10338, MPFR_RNDN);
        mpfr_mul(r10340, r10337, r10339, MPFR_RNDN);
        mpfr_set_d(r10341, phi1, MPFR_RNDN);
        mpfr_cos(r10342, r10341, MPFR_RNDN);
        mpfr_sin(r10343, r10338, MPFR_RNDN);
        mpfr_mul(r10344, r10342, r10343, MPFR_RNDN);
        mpfr_sin(r10345, r10341, MPFR_RNDN);
        mpfr_mul(r10346, r10345, r10339, MPFR_RNDN);
        mpfr_mul(r10347, r10333, r10331, MPFR_RNDN);
        mpfr_mul(r10348, r10329, r10335, MPFR_RNDN);
        mpfr_cbrt(r10349, r10348, MPFR_RNDN);
        mpfr_mul(r10350, r10349, r10349, MPFR_RNDN);
        mpfr_mul(r10351, r10350, r10349, MPFR_RNDN);
        mpfr_sub(r10352, r10347, r10351, MPFR_RNDN);
        mpfr_mul(r10353, r10346, r10352, MPFR_RNDN);
        mpfr_sub(r10354, r10344, r10353, MPFR_RNDN);
        mpfr_atan2(r10355, r10340, r10354, MPFR_RNDN);
        return mpfr_get_d(r10355, MPFR_RNDN);
}

static mpfr_t r10356, r10357, r10358, r10359, r10360, r10361, r10362, r10363, r10364, r10365, r10366, r10367, r10368, r10369, r10370, r10371, r10372, r10373, r10374, r10375, r10376, r10377, r10378, r10379, r10380, r10381, r10382, r10383;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r10356);
        mpfr_init(r10357);
        mpfr_init(r10358);
        mpfr_init(r10359);
        mpfr_init(r10360);
        mpfr_init(r10361);
        mpfr_init(r10362);
        mpfr_init(r10363);
        mpfr_init(r10364);
        mpfr_init(r10365);
        mpfr_init(r10366);
        mpfr_init(r10367);
        mpfr_init(r10368);
        mpfr_init(r10369);
        mpfr_init(r10370);
        mpfr_init(r10371);
        mpfr_init(r10372);
        mpfr_init(r10373);
        mpfr_init(r10374);
        mpfr_init(r10375);
        mpfr_init(r10376);
        mpfr_init(r10377);
        mpfr_init(r10378);
        mpfr_init(r10379);
        mpfr_init(r10380);
        mpfr_init(r10381);
        mpfr_init(r10382);
        mpfr_init(r10383);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r10356, lambda1, MPFR_RNDN);
        mpfr_sin(r10357, r10356, MPFR_RNDN);
        mpfr_set_d(r10358, lambda2, MPFR_RNDN);
        mpfr_cos(r10359, r10358, MPFR_RNDN);
        mpfr_mul(r10360, r10357, r10359, MPFR_RNDN);
        mpfr_cos(r10361, r10356, MPFR_RNDN);
        mpfr_neg(r10362, r10358, MPFR_RNDN);
        mpfr_sin(r10363, r10362, MPFR_RNDN);
        mpfr_mul(r10364, r10361, r10363, MPFR_RNDN);
        mpfr_add(r10365, r10360, r10364, MPFR_RNDN);
        mpfr_set_d(r10366, phi2, MPFR_RNDN);
        mpfr_cos(r10367, r10366, MPFR_RNDN);
        mpfr_mul(r10368, r10365, r10367, MPFR_RNDN);
        mpfr_set_d(r10369, phi1, MPFR_RNDN);
        mpfr_cos(r10370, r10369, MPFR_RNDN);
        mpfr_sin(r10371, r10366, MPFR_RNDN);
        mpfr_mul(r10372, r10370, r10371, MPFR_RNDN);
        mpfr_sin(r10373, r10369, MPFR_RNDN);
        mpfr_mul(r10374, r10373, r10367, MPFR_RNDN);
        mpfr_mul(r10375, r10361, r10359, MPFR_RNDN);
        mpfr_mul(r10376, r10357, r10363, MPFR_RNDN);
        mpfr_cbrt(r10377, r10376, MPFR_RNDN);
        mpfr_mul(r10378, r10377, r10377, MPFR_RNDN);
        mpfr_mul(r10379, r10378, r10377, MPFR_RNDN);
        mpfr_sub(r10380, r10375, r10379, MPFR_RNDN);
        mpfr_mul(r10381, r10374, r10380, MPFR_RNDN);
        mpfr_sub(r10382, r10372, r10381, MPFR_RNDN);
        mpfr_atan2(r10383, r10368, r10382, MPFR_RNDN);
        return mpfr_get_d(r10383, MPFR_RNDN);
}

