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

char *name = "Spherical law of cosines";

double f_if(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r8246 = phi1;
        float r8247 = sin(r8246);
        float r8248 = phi2;
        float r8249 = sin(r8248);
        float r8250 = r8247 * r8249;
        float r8251 = cos(r8246);
        float r8252 = cos(r8248);
        float r8253 = r8251 * r8252;
        float r8254 = lambda1;
        float r8255 = lambda2;
        float r8256 = r8254 - r8255;
        float r8257 = cos(r8256);
        float r8258 = r8253 * r8257;
        float r8259 = r8250 + r8258;
        float r8260 = acos(r8259);
        float r8261 = R;
        float r8262 = r8260 * r8261;
        return r8262;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r8263 = phi1;
        double r8264 = sin(r8263);
        double r8265 = phi2;
        double r8266 = sin(r8265);
        double r8267 = r8264 * r8266;
        double r8268 = cos(r8263);
        double r8269 = cos(r8265);
        double r8270 = r8268 * r8269;
        double r8271 = lambda1;
        double r8272 = lambda2;
        double r8273 = r8271 - r8272;
        double r8274 = cos(r8273);
        double r8275 = r8270 * r8274;
        double r8276 = r8267 + r8275;
        double r8277 = acos(r8276);
        double r8278 = R;
        double r8279 = r8277 * r8278;
        return r8279;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r8280 = phi2;
        float r8281 = cos(r8280);
        float r8282 = phi1;
        float r8283 = cos(r8282);
        float r8284 = r8281 * r8283;
        float r8285 = lambda1;
        float r8286 = cos(r8285);
        float r8287 = lambda2;
        float r8288 = cos(r8287);
        float r8289 = sin(r8287);
        float r8290 = sin(r8285);
        float r8291 = r8289 * r8290;
        float r8292 = fma(r8286, r8288, r8291);
        float r8293 = sin(r8282);
        float r8294 = sin(r8280);
        float r8295 = r8293 * r8294;
        float r8296 = fma(r8284, r8292, r8295);
        float r8297 = acos(r8296);
        float r8298 = expm1(r8297);
        float r8299 = log1p(r8298);
        float r8300 = R;
        float r8301 = r8299 * r8300;
        return r8301;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r8302 = phi2;
        double r8303 = cos(r8302);
        double r8304 = phi1;
        double r8305 = cos(r8304);
        double r8306 = r8303 * r8305;
        double r8307 = lambda1;
        double r8308 = cos(r8307);
        double r8309 = lambda2;
        double r8310 = cos(r8309);
        double r8311 = sin(r8309);
        double r8312 = sin(r8307);
        double r8313 = r8311 * r8312;
        double r8314 = fma(r8308, r8310, r8313);
        double r8315 = sin(r8304);
        double r8316 = sin(r8302);
        double r8317 = r8315 * r8316;
        double r8318 = fma(r8306, r8314, r8317);
        double r8319 = acos(r8318);
        double r8320 = expm1(r8319);
        double r8321 = log1p(r8320);
        double r8322 = R;
        double r8323 = r8321 * r8322;
        return r8323;
}

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 r8324, r8325, r8326, r8327, r8328, r8329, r8330, r8331, r8332, r8333, r8334, r8335, r8336, r8337, r8338, r8339, r8340;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2128);
        mpfr_init(r8324);
        mpfr_init(r8325);
        mpfr_init(r8326);
        mpfr_init(r8327);
        mpfr_init(r8328);
        mpfr_init(r8329);
        mpfr_init(r8330);
        mpfr_init(r8331);
        mpfr_init(r8332);
        mpfr_init(r8333);
        mpfr_init(r8334);
        mpfr_init(r8335);
        mpfr_init(r8336);
        mpfr_init(r8337);
        mpfr_init(r8338);
        mpfr_init(r8339);
        mpfr_init(r8340);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8324, phi1, MPFR_RNDN);
        mpfr_sin(r8325, r8324, MPFR_RNDN);
        mpfr_set_d(r8326, phi2, MPFR_RNDN);
        mpfr_sin(r8327, r8326, MPFR_RNDN);
        mpfr_mul(r8328, r8325, r8327, MPFR_RNDN);
        mpfr_cos(r8329, r8324, MPFR_RNDN);
        mpfr_cos(r8330, r8326, MPFR_RNDN);
        mpfr_mul(r8331, r8329, r8330, MPFR_RNDN);
        mpfr_set_d(r8332, lambda1, MPFR_RNDN);
        mpfr_set_d(r8333, lambda2, MPFR_RNDN);
        mpfr_sub(r8334, r8332, r8333, MPFR_RNDN);
        mpfr_cos(r8335, r8334, MPFR_RNDN);
        mpfr_mul(r8336, r8331, r8335, MPFR_RNDN);
        mpfr_add(r8337, r8328, r8336, MPFR_RNDN);
        mpfr_acos(r8338, r8337, MPFR_RNDN);
        mpfr_set_d(r8339, R, MPFR_RNDN);
        mpfr_mul(r8340, r8338, r8339, MPFR_RNDN);
        return mpfr_get_d(r8340, MPFR_RNDN);
}

static mpfr_t r8341, r8342, r8343, r8344, r8345, r8346, r8347, r8348, r8349, r8350, r8351, r8352, r8353, r8354, r8355, r8356, r8357, r8358, r8359, r8360, r8361, r8362;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2128);
        mpfr_init(r8341);
        mpfr_init(r8342);
        mpfr_init(r8343);
        mpfr_init(r8344);
        mpfr_init(r8345);
        mpfr_init(r8346);
        mpfr_init(r8347);
        mpfr_init(r8348);
        mpfr_init(r8349);
        mpfr_init(r8350);
        mpfr_init(r8351);
        mpfr_init(r8352);
        mpfr_init(r8353);
        mpfr_init(r8354);
        mpfr_init(r8355);
        mpfr_init(r8356);
        mpfr_init(r8357);
        mpfr_init(r8358);
        mpfr_init(r8359);
        mpfr_init(r8360);
        mpfr_init(r8361);
        mpfr_init(r8362);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8341, phi2, MPFR_RNDN);
        mpfr_cos(r8342, r8341, MPFR_RNDN);
        mpfr_set_d(r8343, phi1, MPFR_RNDN);
        mpfr_cos(r8344, r8343, MPFR_RNDN);
        mpfr_mul(r8345, r8342, r8344, MPFR_RNDN);
        mpfr_set_d(r8346, lambda1, MPFR_RNDN);
        mpfr_cos(r8347, r8346, MPFR_RNDN);
        mpfr_set_d(r8348, lambda2, MPFR_RNDN);
        mpfr_cos(r8349, r8348, MPFR_RNDN);
        mpfr_sin(r8350, r8348, MPFR_RNDN);
        mpfr_sin(r8351, r8346, MPFR_RNDN);
        mpfr_mul(r8352, r8350, r8351, MPFR_RNDN);
        mpfr_fma(r8353, r8347, r8349, r8352, MPFR_RNDN);
        mpfr_sin(r8354, r8343, MPFR_RNDN);
        mpfr_sin(r8355, r8341, MPFR_RNDN);
        mpfr_mul(r8356, r8354, r8355, MPFR_RNDN);
        mpfr_fma(r8357, r8345, r8353, r8356, MPFR_RNDN);
        mpfr_acos(r8358, r8357, MPFR_RNDN);
        mpfr_expm1(r8359, r8358, MPFR_RNDN);
        mpfr_log1p(r8360, r8359, MPFR_RNDN);
        mpfr_set_d(r8361, R, MPFR_RNDN);
        mpfr_mul(r8362, r8360, r8361, MPFR_RNDN);
        return mpfr_get_d(r8362, MPFR_RNDN);
}

static mpfr_t r8363, r8364, r8365, r8366, r8367, r8368, r8369, r8370, r8371, r8372, r8373, r8374, r8375, r8376, r8377, r8378, r8379, r8380, r8381, r8382, r8383, r8384;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2128);
        mpfr_init(r8363);
        mpfr_init(r8364);
        mpfr_init(r8365);
        mpfr_init(r8366);
        mpfr_init(r8367);
        mpfr_init(r8368);
        mpfr_init(r8369);
        mpfr_init(r8370);
        mpfr_init(r8371);
        mpfr_init(r8372);
        mpfr_init(r8373);
        mpfr_init(r8374);
        mpfr_init(r8375);
        mpfr_init(r8376);
        mpfr_init(r8377);
        mpfr_init(r8378);
        mpfr_init(r8379);
        mpfr_init(r8380);
        mpfr_init(r8381);
        mpfr_init(r8382);
        mpfr_init(r8383);
        mpfr_init(r8384);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8363, phi2, MPFR_RNDN);
        mpfr_cos(r8364, r8363, MPFR_RNDN);
        mpfr_set_d(r8365, phi1, MPFR_RNDN);
        mpfr_cos(r8366, r8365, MPFR_RNDN);
        mpfr_mul(r8367, r8364, r8366, MPFR_RNDN);
        mpfr_set_d(r8368, lambda1, MPFR_RNDN);
        mpfr_cos(r8369, r8368, MPFR_RNDN);
        mpfr_set_d(r8370, lambda2, MPFR_RNDN);
        mpfr_cos(r8371, r8370, MPFR_RNDN);
        mpfr_sin(r8372, r8370, MPFR_RNDN);
        mpfr_sin(r8373, r8368, MPFR_RNDN);
        mpfr_mul(r8374, r8372, r8373, MPFR_RNDN);
        mpfr_fma(r8375, r8369, r8371, r8374, MPFR_RNDN);
        mpfr_sin(r8376, r8365, MPFR_RNDN);
        mpfr_sin(r8377, r8363, MPFR_RNDN);
        mpfr_mul(r8378, r8376, r8377, MPFR_RNDN);
        mpfr_fma(r8379, r8367, r8375, r8378, MPFR_RNDN);
        mpfr_acos(r8380, r8379, MPFR_RNDN);
        mpfr_expm1(r8381, r8380, MPFR_RNDN);
        mpfr_log1p(r8382, r8381, MPFR_RNDN);
        mpfr_set_d(r8383, R, MPFR_RNDN);
        mpfr_mul(r8384, r8382, r8383, MPFR_RNDN);
        return mpfr_get_d(r8384, MPFR_RNDN);
}

