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

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

double f_if(float lambda1, float lambda2, float phi1, float phi2) {
        float r22272 = lambda1;
        float r22273 = phi2;
        float r22274 = cos(r22273);
        float r22275 = lambda2;
        float r22276 = r22272 - r22275;
        float r22277 = sin(r22276);
        float r22278 = r22274 * r22277;
        float r22279 = phi1;
        float r22280 = cos(r22279);
        float r22281 = cos(r22276);
        float r22282 = r22274 * r22281;
        float r22283 = r22280 + r22282;
        float r22284 = atan2(r22278, r22283);
        float r22285 = r22272 + r22284;
        return r22285;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r22286 = lambda1;
        double r22287 = phi2;
        double r22288 = cos(r22287);
        double r22289 = lambda2;
        double r22290 = r22286 - r22289;
        double r22291 = sin(r22290);
        double r22292 = r22288 * r22291;
        double r22293 = phi1;
        double r22294 = cos(r22293);
        double r22295 = cos(r22290);
        double r22296 = r22288 * r22295;
        double r22297 = r22294 + r22296;
        double r22298 = atan2(r22292, r22297);
        double r22299 = r22286 + r22298;
        return r22299;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r22300 = phi2;
        float r22301 = cos(r22300);
        float r22302 = lambda1;
        float r22303 = sin(r22302);
        float r22304 = lambda2;
        float r22305 = cos(r22304);
        float r22306 = r22303 * r22305;
        float r22307 = cbrt(r22306);
        float r22308 = r22307 * r22307;
        float r22309 = r22308 * r22307;
        float r22310 = cos(r22302);
        float r22311 = -r22304;
        float r22312 = sin(r22311);
        float r22313 = r22310 * r22312;
        float r22314 = r22309 + r22313;
        float r22315 = r22301 * r22314;
        float r22316 = r22310 * r22305;
        float r22317 = r22303 * r22312;
        float r22318 = r22316 - r22317;
        float r22319 = phi1;
        float r22320 = cos(r22319);
        float r22321 = fma(r22301, r22318, r22320);
        float r22322 = atan2(r22315, r22321);
        float r22323 = r22322 + r22302;
        return r22323;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r22324 = phi2;
        double r22325 = cos(r22324);
        double r22326 = lambda1;
        double r22327 = sin(r22326);
        double r22328 = lambda2;
        double r22329 = cos(r22328);
        double r22330 = r22327 * r22329;
        double r22331 = cbrt(r22330);
        double r22332 = r22331 * r22331;
        double r22333 = r22332 * r22331;
        double r22334 = cos(r22326);
        double r22335 = -r22328;
        double r22336 = sin(r22335);
        double r22337 = r22334 * r22336;
        double r22338 = r22333 + r22337;
        double r22339 = r22325 * r22338;
        double r22340 = r22334 * r22329;
        double r22341 = r22327 * r22336;
        double r22342 = r22340 - r22341;
        double r22343 = phi1;
        double r22344 = cos(r22343);
        double r22345 = fma(r22325, r22342, r22344);
        double r22346 = atan2(r22339, r22345);
        double r22347 = r22346 + r22326;
        return r22347;
}

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 r22348, r22349, r22350, r22351, r22352, r22353, r22354, r22355, r22356, r22357, r22358, r22359, r22360, r22361;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r22348);
        mpfr_init(r22349);
        mpfr_init(r22350);
        mpfr_init(r22351);
        mpfr_init(r22352);
        mpfr_init(r22353);
        mpfr_init(r22354);
        mpfr_init(r22355);
        mpfr_init(r22356);
        mpfr_init(r22357);
        mpfr_init(r22358);
        mpfr_init(r22359);
        mpfr_init(r22360);
        mpfr_init(r22361);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r22348, lambda1, MPFR_RNDN);
        mpfr_set_d(r22349, phi2, MPFR_RNDN);
        mpfr_cos(r22350, r22349, MPFR_RNDN);
        mpfr_set_d(r22351, lambda2, MPFR_RNDN);
        mpfr_sub(r22352, r22348, r22351, MPFR_RNDN);
        mpfr_sin(r22353, r22352, MPFR_RNDN);
        mpfr_mul(r22354, r22350, r22353, MPFR_RNDN);
        mpfr_set_d(r22355, phi1, MPFR_RNDN);
        mpfr_cos(r22356, r22355, MPFR_RNDN);
        mpfr_cos(r22357, r22352, MPFR_RNDN);
        mpfr_mul(r22358, r22350, r22357, MPFR_RNDN);
        mpfr_add(r22359, r22356, r22358, MPFR_RNDN);
        mpfr_atan2(r22360, r22354, r22359, MPFR_RNDN);
        mpfr_add(r22361, r22348, r22360, MPFR_RNDN);
        return mpfr_get_d(r22361, MPFR_RNDN);
}

static mpfr_t r22362, r22363, r22364, r22365, r22366, r22367, r22368, r22369, r22370, r22371, r22372, r22373, r22374, r22375, r22376, r22377, r22378, r22379, r22380, r22381, r22382, r22383, r22384, r22385;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r22362);
        mpfr_init(r22363);
        mpfr_init(r22364);
        mpfr_init(r22365);
        mpfr_init(r22366);
        mpfr_init(r22367);
        mpfr_init(r22368);
        mpfr_init(r22369);
        mpfr_init(r22370);
        mpfr_init(r22371);
        mpfr_init(r22372);
        mpfr_init(r22373);
        mpfr_init(r22374);
        mpfr_init(r22375);
        mpfr_init(r22376);
        mpfr_init(r22377);
        mpfr_init(r22378);
        mpfr_init(r22379);
        mpfr_init(r22380);
        mpfr_init(r22381);
        mpfr_init(r22382);
        mpfr_init(r22383);
        mpfr_init(r22384);
        mpfr_init(r22385);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r22362, phi2, MPFR_RNDN);
        mpfr_cos(r22363, r22362, MPFR_RNDN);
        mpfr_set_d(r22364, lambda1, MPFR_RNDN);
        mpfr_sin(r22365, r22364, MPFR_RNDN);
        mpfr_set_d(r22366, lambda2, MPFR_RNDN);
        mpfr_cos(r22367, r22366, MPFR_RNDN);
        mpfr_mul(r22368, r22365, r22367, MPFR_RNDN);
        mpfr_cbrt(r22369, r22368, MPFR_RNDN);
        mpfr_mul(r22370, r22369, r22369, MPFR_RNDN);
        mpfr_mul(r22371, r22370, r22369, MPFR_RNDN);
        mpfr_cos(r22372, r22364, MPFR_RNDN);
        mpfr_neg(r22373, r22366, MPFR_RNDN);
        mpfr_sin(r22374, r22373, MPFR_RNDN);
        mpfr_mul(r22375, r22372, r22374, MPFR_RNDN);
        mpfr_add(r22376, r22371, r22375, MPFR_RNDN);
        mpfr_mul(r22377, r22363, r22376, MPFR_RNDN);
        mpfr_mul(r22378, r22372, r22367, MPFR_RNDN);
        mpfr_mul(r22379, r22365, r22374, MPFR_RNDN);
        mpfr_sub(r22380, r22378, r22379, MPFR_RNDN);
        mpfr_set_d(r22381, phi1, MPFR_RNDN);
        mpfr_cos(r22382, r22381, MPFR_RNDN);
        mpfr_fma(r22383, r22363, r22380, r22382, MPFR_RNDN);
        mpfr_atan2(r22384, r22377, r22383, MPFR_RNDN);
        mpfr_add(r22385, r22384, r22364, MPFR_RNDN);
        return mpfr_get_d(r22385, MPFR_RNDN);
}

static mpfr_t r22386, r22387, r22388, r22389, r22390, r22391, r22392, r22393, r22394, r22395, r22396, r22397, r22398, r22399, r22400, r22401, r22402, r22403, r22404, r22405, r22406, r22407, r22408, r22409;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r22386);
        mpfr_init(r22387);
        mpfr_init(r22388);
        mpfr_init(r22389);
        mpfr_init(r22390);
        mpfr_init(r22391);
        mpfr_init(r22392);
        mpfr_init(r22393);
        mpfr_init(r22394);
        mpfr_init(r22395);
        mpfr_init(r22396);
        mpfr_init(r22397);
        mpfr_init(r22398);
        mpfr_init(r22399);
        mpfr_init(r22400);
        mpfr_init(r22401);
        mpfr_init(r22402);
        mpfr_init(r22403);
        mpfr_init(r22404);
        mpfr_init(r22405);
        mpfr_init(r22406);
        mpfr_init(r22407);
        mpfr_init(r22408);
        mpfr_init(r22409);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r22386, phi2, MPFR_RNDN);
        mpfr_cos(r22387, r22386, MPFR_RNDN);
        mpfr_set_d(r22388, lambda1, MPFR_RNDN);
        mpfr_sin(r22389, r22388, MPFR_RNDN);
        mpfr_set_d(r22390, lambda2, MPFR_RNDN);
        mpfr_cos(r22391, r22390, MPFR_RNDN);
        mpfr_mul(r22392, r22389, r22391, MPFR_RNDN);
        mpfr_cbrt(r22393, r22392, MPFR_RNDN);
        mpfr_mul(r22394, r22393, r22393, MPFR_RNDN);
        mpfr_mul(r22395, r22394, r22393, MPFR_RNDN);
        mpfr_cos(r22396, r22388, MPFR_RNDN);
        mpfr_neg(r22397, r22390, MPFR_RNDN);
        mpfr_sin(r22398, r22397, MPFR_RNDN);
        mpfr_mul(r22399, r22396, r22398, MPFR_RNDN);
        mpfr_add(r22400, r22395, r22399, MPFR_RNDN);
        mpfr_mul(r22401, r22387, r22400, MPFR_RNDN);
        mpfr_mul(r22402, r22396, r22391, MPFR_RNDN);
        mpfr_mul(r22403, r22389, r22398, MPFR_RNDN);
        mpfr_sub(r22404, r22402, r22403, MPFR_RNDN);
        mpfr_set_d(r22405, phi1, MPFR_RNDN);
        mpfr_cos(r22406, r22405, MPFR_RNDN);
        mpfr_fma(r22407, r22387, r22404, r22406, MPFR_RNDN);
        mpfr_atan2(r22408, r22401, r22407, MPFR_RNDN);
        mpfr_add(r22409, r22408, r22388, MPFR_RNDN);
        return mpfr_get_d(r22409, MPFR_RNDN);
}

