#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 r8384 = lambda1;
        float r8385 = phi2;
        float r8386 = cos(r8385);
        float r8387 = lambda2;
        float r8388 = r8384 - r8387;
        float r8389 = sin(r8388);
        float r8390 = r8386 * r8389;
        float r8391 = phi1;
        float r8392 = cos(r8391);
        float r8393 = cos(r8388);
        float r8394 = r8386 * r8393;
        float r8395 = r8392 + r8394;
        float r8396 = atan2(r8390, r8395);
        float r8397 = r8384 + r8396;
        return r8397;
}

double f_id(double lambda1, double lambda2, double phi1, double phi2) {
        double r8398 = lambda1;
        double r8399 = phi2;
        double r8400 = cos(r8399);
        double r8401 = lambda2;
        double r8402 = r8398 - r8401;
        double r8403 = sin(r8402);
        double r8404 = r8400 * r8403;
        double r8405 = phi1;
        double r8406 = cos(r8405);
        double r8407 = cos(r8402);
        double r8408 = r8400 * r8407;
        double r8409 = r8406 + r8408;
        double r8410 = atan2(r8404, r8409);
        double r8411 = r8398 + r8410;
        return r8411;
}


double f_of(float lambda1, float lambda2, float phi1, float phi2) {
        float r8412 = lambda1;
        float r8413 = sin(r8412);
        float r8414 = lambda2;
        float r8415 = cos(r8414);
        float r8416 = r8413 * r8415;
        float r8417 = cos(r8412);
        float r8418 = sin(r8414);
        float r8419 = r8417 * r8418;
        float r8420 = r8416 - r8419;
        float r8421 = phi2;
        float r8422 = cos(r8421);
        float r8423 = r8420 * r8422;
        float r8424 = r8418 * r8413;
        float r8425 = exp(r8424);
        float r8426 = log(r8425);
        float r8427 = r8417 * r8415;
        float r8428 = r8426 + r8427;
        float r8429 = phi1;
        float r8430 = cos(r8429);
        float r8431 = fma(r8422, r8428, r8430);
        float r8432 = r8431 * r8431;
        float r8433 = r8431 * r8432;
        float r8434 = cbrt(r8433);
        float r8435 = atan2(r8423, r8434);
        float r8436 = r8435 + r8412;
        return r8436;
}

double f_od(double lambda1, double lambda2, double phi1, double phi2) {
        double r8437 = lambda1;
        double r8438 = sin(r8437);
        double r8439 = lambda2;
        double r8440 = cos(r8439);
        double r8441 = r8438 * r8440;
        double r8442 = cos(r8437);
        double r8443 = sin(r8439);
        double r8444 = r8442 * r8443;
        double r8445 = r8441 - r8444;
        double r8446 = phi2;
        double r8447 = cos(r8446);
        double r8448 = r8445 * r8447;
        double r8449 = r8443 * r8438;
        double r8450 = exp(r8449);
        double r8451 = log(r8450);
        double r8452 = r8442 * r8440;
        double r8453 = r8451 + r8452;
        double r8454 = phi1;
        double r8455 = cos(r8454);
        double r8456 = fma(r8447, r8453, r8455);
        double r8457 = r8456 * r8456;
        double r8458 = r8456 * r8457;
        double r8459 = cbrt(r8458);
        double r8460 = atan2(r8448, r8459);
        double r8461 = r8460 + r8437;
        return r8461;
}

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 r8462, r8463, r8464, r8465, r8466, r8467, r8468, r8469, r8470, r8471, r8472, r8473, r8474, r8475;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8462);
        mpfr_init(r8463);
        mpfr_init(r8464);
        mpfr_init(r8465);
        mpfr_init(r8466);
        mpfr_init(r8467);
        mpfr_init(r8468);
        mpfr_init(r8469);
        mpfr_init(r8470);
        mpfr_init(r8471);
        mpfr_init(r8472);
        mpfr_init(r8473);
        mpfr_init(r8474);
        mpfr_init(r8475);
}

double f_im(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8462, lambda1, MPFR_RNDN);
        mpfr_set_d(r8463, phi2, MPFR_RNDN);
        mpfr_cos(r8464, r8463, MPFR_RNDN);
        mpfr_set_d(r8465, lambda2, MPFR_RNDN);
        mpfr_sub(r8466, r8462, r8465, MPFR_RNDN);
        mpfr_sin(r8467, r8466, MPFR_RNDN);
        mpfr_mul(r8468, r8464, r8467, MPFR_RNDN);
        mpfr_set_d(r8469, phi1, MPFR_RNDN);
        mpfr_cos(r8470, r8469, MPFR_RNDN);
        mpfr_cos(r8471, r8466, MPFR_RNDN);
        mpfr_mul(r8472, r8464, r8471, MPFR_RNDN);
        mpfr_add(r8473, r8470, r8472, MPFR_RNDN);
        mpfr_atan2(r8474, r8468, r8473, MPFR_RNDN);
        mpfr_add(r8475, r8462, r8474, MPFR_RNDN);
        return mpfr_get_d(r8475, MPFR_RNDN);
}

static mpfr_t r8476, r8477, r8478, r8479, r8480, r8481, r8482, r8483, r8484, r8485, r8486, r8487, r8488, r8489, r8490, r8491, r8492, r8493, r8494, r8495, r8496, r8497, r8498, r8499, r8500;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8476);
        mpfr_init(r8477);
        mpfr_init(r8478);
        mpfr_init(r8479);
        mpfr_init(r8480);
        mpfr_init(r8481);
        mpfr_init(r8482);
        mpfr_init(r8483);
        mpfr_init(r8484);
        mpfr_init(r8485);
        mpfr_init(r8486);
        mpfr_init(r8487);
        mpfr_init(r8488);
        mpfr_init(r8489);
        mpfr_init(r8490);
        mpfr_init(r8491);
        mpfr_init(r8492);
        mpfr_init(r8493);
        mpfr_init(r8494);
        mpfr_init(r8495);
        mpfr_init(r8496);
        mpfr_init(r8497);
        mpfr_init(r8498);
        mpfr_init(r8499);
        mpfr_init(r8500);
}

double f_fm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8476, lambda1, MPFR_RNDN);
        mpfr_sin(r8477, r8476, MPFR_RNDN);
        mpfr_set_d(r8478, lambda2, MPFR_RNDN);
        mpfr_cos(r8479, r8478, MPFR_RNDN);
        mpfr_mul(r8480, r8477, r8479, MPFR_RNDN);
        mpfr_cos(r8481, r8476, MPFR_RNDN);
        mpfr_sin(r8482, r8478, MPFR_RNDN);
        mpfr_mul(r8483, r8481, r8482, MPFR_RNDN);
        mpfr_sub(r8484, r8480, r8483, MPFR_RNDN);
        mpfr_set_d(r8485, phi2, MPFR_RNDN);
        mpfr_cos(r8486, r8485, MPFR_RNDN);
        mpfr_mul(r8487, r8484, r8486, MPFR_RNDN);
        mpfr_mul(r8488, r8482, r8477, MPFR_RNDN);
        mpfr_exp(r8489, r8488, MPFR_RNDN);
        mpfr_log(r8490, r8489, MPFR_RNDN);
        mpfr_mul(r8491, r8481, r8479, MPFR_RNDN);
        mpfr_add(r8492, r8490, r8491, MPFR_RNDN);
        mpfr_set_d(r8493, phi1, MPFR_RNDN);
        mpfr_cos(r8494, r8493, MPFR_RNDN);
        mpfr_fma(r8495, r8486, r8492, r8494, MPFR_RNDN);
        mpfr_mul(r8496, r8495, r8495, MPFR_RNDN);
        mpfr_mul(r8497, r8495, r8496, MPFR_RNDN);
        mpfr_cbrt(r8498, r8497, MPFR_RNDN);
        mpfr_atan2(r8499, r8487, r8498, MPFR_RNDN);
        mpfr_add(r8500, r8499, r8476, MPFR_RNDN);
        return mpfr_get_d(r8500, MPFR_RNDN);
}

static mpfr_t r8501, r8502, r8503, r8504, r8505, r8506, r8507, r8508, r8509, r8510, r8511, r8512, r8513, r8514, r8515, r8516, r8517, r8518, r8519, r8520, r8521, r8522, r8523, r8524, r8525;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1360);
        mpfr_init(r8501);
        mpfr_init(r8502);
        mpfr_init(r8503);
        mpfr_init(r8504);
        mpfr_init(r8505);
        mpfr_init(r8506);
        mpfr_init(r8507);
        mpfr_init(r8508);
        mpfr_init(r8509);
        mpfr_init(r8510);
        mpfr_init(r8511);
        mpfr_init(r8512);
        mpfr_init(r8513);
        mpfr_init(r8514);
        mpfr_init(r8515);
        mpfr_init(r8516);
        mpfr_init(r8517);
        mpfr_init(r8518);
        mpfr_init(r8519);
        mpfr_init(r8520);
        mpfr_init(r8521);
        mpfr_init(r8522);
        mpfr_init(r8523);
        mpfr_init(r8524);
        mpfr_init(r8525);
}

double f_dm(double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8501, lambda1, MPFR_RNDN);
        mpfr_sin(r8502, r8501, MPFR_RNDN);
        mpfr_set_d(r8503, lambda2, MPFR_RNDN);
        mpfr_cos(r8504, r8503, MPFR_RNDN);
        mpfr_mul(r8505, r8502, r8504, MPFR_RNDN);
        mpfr_cos(r8506, r8501, MPFR_RNDN);
        mpfr_sin(r8507, r8503, MPFR_RNDN);
        mpfr_mul(r8508, r8506, r8507, MPFR_RNDN);
        mpfr_sub(r8509, r8505, r8508, MPFR_RNDN);
        mpfr_set_d(r8510, phi2, MPFR_RNDN);
        mpfr_cos(r8511, r8510, MPFR_RNDN);
        mpfr_mul(r8512, r8509, r8511, MPFR_RNDN);
        mpfr_mul(r8513, r8507, r8502, MPFR_RNDN);
        mpfr_exp(r8514, r8513, MPFR_RNDN);
        mpfr_log(r8515, r8514, MPFR_RNDN);
        mpfr_mul(r8516, r8506, r8504, MPFR_RNDN);
        mpfr_add(r8517, r8515, r8516, MPFR_RNDN);
        mpfr_set_d(r8518, phi1, MPFR_RNDN);
        mpfr_cos(r8519, r8518, MPFR_RNDN);
        mpfr_fma(r8520, r8511, r8517, r8519, MPFR_RNDN);
        mpfr_mul(r8521, r8520, r8520, MPFR_RNDN);
        mpfr_mul(r8522, r8520, r8521, MPFR_RNDN);
        mpfr_cbrt(r8523, r8522, MPFR_RNDN);
        mpfr_atan2(r8524, r8512, r8523, MPFR_RNDN);
        mpfr_add(r8525, r8524, r8501, MPFR_RNDN);
        return mpfr_get_d(r8525, MPFR_RNDN);
}

