#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 r8034 = phi1;
        float r8035 = sin(r8034);
        float r8036 = phi2;
        float r8037 = sin(r8036);
        float r8038 = r8035 * r8037;
        float r8039 = cos(r8034);
        float r8040 = cos(r8036);
        float r8041 = r8039 * r8040;
        float r8042 = lambda1;
        float r8043 = lambda2;
        float r8044 = r8042 - r8043;
        float r8045 = cos(r8044);
        float r8046 = r8041 * r8045;
        float r8047 = r8038 + r8046;
        float r8048 = acos(r8047);
        float r8049 = R;
        float r8050 = r8048 * r8049;
        return r8050;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r8051 = phi1;
        double r8052 = sin(r8051);
        double r8053 = phi2;
        double r8054 = sin(r8053);
        double r8055 = r8052 * r8054;
        double r8056 = cos(r8051);
        double r8057 = cos(r8053);
        double r8058 = r8056 * r8057;
        double r8059 = lambda1;
        double r8060 = lambda2;
        double r8061 = r8059 - r8060;
        double r8062 = cos(r8061);
        double r8063 = r8058 * r8062;
        double r8064 = r8055 + r8063;
        double r8065 = acos(r8064);
        double r8066 = R;
        double r8067 = r8065 * r8066;
        return r8067;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r8068 = phi1;
        float r8069 = sin(r8068);
        float r8070 = phi2;
        float r8071 = sin(r8070);
        float r8072 = r8069 * r8071;
        float r8073 = cos(r8070);
        float r8074 = cos(r8068);
        float r8075 = r8073 * r8074;
        float r8076 = exp(r8075);
        float r8077 = lambda1;
        float r8078 = sin(r8077);
        float r8079 = lambda2;
        float r8080 = sin(r8079);
        float r8081 = r8078 * r8080;
        float r8082 = cos(r8077);
        float r8083 = cos(r8079);
        float r8084 = r8082 * r8083;
        float r8085 = r8081 + r8084;
        float r8086 = pow(r8076, r8085);
        float r8087 = log(r8086);
        float r8088 = r8072 + r8087;
        float r8089 = acos(r8088);
        float r8090 = R;
        float r8091 = r8089 * r8090;
        return r8091;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r8092 = phi1;
        double r8093 = sin(r8092);
        double r8094 = phi2;
        double r8095 = sin(r8094);
        double r8096 = r8093 * r8095;
        double r8097 = cos(r8094);
        double r8098 = cos(r8092);
        double r8099 = r8097 * r8098;
        double r8100 = exp(r8099);
        double r8101 = lambda1;
        double r8102 = sin(r8101);
        double r8103 = lambda2;
        double r8104 = sin(r8103);
        double r8105 = r8102 * r8104;
        double r8106 = cos(r8101);
        double r8107 = cos(r8103);
        double r8108 = r8106 * r8107;
        double r8109 = r8105 + r8108;
        double r8110 = pow(r8100, r8109);
        double r8111 = log(r8110);
        double r8112 = r8096 + r8111;
        double r8113 = acos(r8112);
        double r8114 = R;
        double r8115 = r8113 * r8114;
        return r8115;
}

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 r8116, r8117, r8118, r8119, r8120, r8121, r8122, r8123, r8124, r8125, r8126, r8127, r8128, r8129, r8130, r8131, r8132;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2128);
        mpfr_init(r8116);
        mpfr_init(r8117);
        mpfr_init(r8118);
        mpfr_init(r8119);
        mpfr_init(r8120);
        mpfr_init(r8121);
        mpfr_init(r8122);
        mpfr_init(r8123);
        mpfr_init(r8124);
        mpfr_init(r8125);
        mpfr_init(r8126);
        mpfr_init(r8127);
        mpfr_init(r8128);
        mpfr_init(r8129);
        mpfr_init(r8130);
        mpfr_init(r8131);
        mpfr_init(r8132);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8116, phi1, MPFR_RNDN);
        mpfr_sin(r8117, r8116, MPFR_RNDN);
        mpfr_set_d(r8118, phi2, MPFR_RNDN);
        mpfr_sin(r8119, r8118, MPFR_RNDN);
        mpfr_mul(r8120, r8117, r8119, MPFR_RNDN);
        mpfr_cos(r8121, r8116, MPFR_RNDN);
        mpfr_cos(r8122, r8118, MPFR_RNDN);
        mpfr_mul(r8123, r8121, r8122, MPFR_RNDN);
        mpfr_set_d(r8124, lambda1, MPFR_RNDN);
        mpfr_set_d(r8125, lambda2, MPFR_RNDN);
        mpfr_sub(r8126, r8124, r8125, MPFR_RNDN);
        mpfr_cos(r8127, r8126, MPFR_RNDN);
        mpfr_mul(r8128, r8123, r8127, MPFR_RNDN);
        mpfr_add(r8129, r8120, r8128, MPFR_RNDN);
        mpfr_acos(r8130, r8129, MPFR_RNDN);
        mpfr_set_d(r8131, R, MPFR_RNDN);
        mpfr_mul(r8132, r8130, r8131, MPFR_RNDN);
        return mpfr_get_d(r8132, MPFR_RNDN);
}

static mpfr_t r8133, r8134, r8135, r8136, r8137, r8138, r8139, r8140, r8141, r8142, r8143, r8144, r8145, r8146, r8147, r8148, r8149, r8150, r8151, r8152, r8153, r8154, r8155, r8156;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2128);
        mpfr_init(r8133);
        mpfr_init(r8134);
        mpfr_init(r8135);
        mpfr_init(r8136);
        mpfr_init(r8137);
        mpfr_init(r8138);
        mpfr_init(r8139);
        mpfr_init(r8140);
        mpfr_init(r8141);
        mpfr_init(r8142);
        mpfr_init(r8143);
        mpfr_init(r8144);
        mpfr_init(r8145);
        mpfr_init(r8146);
        mpfr_init(r8147);
        mpfr_init(r8148);
        mpfr_init(r8149);
        mpfr_init(r8150);
        mpfr_init(r8151);
        mpfr_init(r8152);
        mpfr_init(r8153);
        mpfr_init(r8154);
        mpfr_init(r8155);
        mpfr_init(r8156);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8133, phi1, MPFR_RNDN);
        mpfr_sin(r8134, r8133, MPFR_RNDN);
        mpfr_set_d(r8135, phi2, MPFR_RNDN);
        mpfr_sin(r8136, r8135, MPFR_RNDN);
        mpfr_mul(r8137, r8134, r8136, MPFR_RNDN);
        mpfr_cos(r8138, r8135, MPFR_RNDN);
        mpfr_cos(r8139, r8133, MPFR_RNDN);
        mpfr_mul(r8140, r8138, r8139, MPFR_RNDN);
        mpfr_exp(r8141, r8140, MPFR_RNDN);
        mpfr_set_d(r8142, lambda1, MPFR_RNDN);
        mpfr_sin(r8143, r8142, MPFR_RNDN);
        mpfr_set_d(r8144, lambda2, MPFR_RNDN);
        mpfr_sin(r8145, r8144, MPFR_RNDN);
        mpfr_mul(r8146, r8143, r8145, MPFR_RNDN);
        mpfr_cos(r8147, r8142, MPFR_RNDN);
        mpfr_cos(r8148, r8144, MPFR_RNDN);
        mpfr_mul(r8149, r8147, r8148, MPFR_RNDN);
        mpfr_add(r8150, r8146, r8149, MPFR_RNDN);
        mpfr_pow(r8151, r8141, r8150, MPFR_RNDN);
        mpfr_log(r8152, r8151, MPFR_RNDN);
        mpfr_add(r8153, r8137, r8152, MPFR_RNDN);
        mpfr_acos(r8154, r8153, MPFR_RNDN);
        mpfr_set_d(r8155, R, MPFR_RNDN);
        mpfr_mul(r8156, r8154, r8155, MPFR_RNDN);
        return mpfr_get_d(r8156, MPFR_RNDN);
}

static mpfr_t r8157, r8158, r8159, r8160, r8161, r8162, r8163, r8164, r8165, r8166, r8167, r8168, r8169, r8170, r8171, r8172, r8173, r8174, r8175, r8176, r8177, r8178, r8179, r8180;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2128);
        mpfr_init(r8157);
        mpfr_init(r8158);
        mpfr_init(r8159);
        mpfr_init(r8160);
        mpfr_init(r8161);
        mpfr_init(r8162);
        mpfr_init(r8163);
        mpfr_init(r8164);
        mpfr_init(r8165);
        mpfr_init(r8166);
        mpfr_init(r8167);
        mpfr_init(r8168);
        mpfr_init(r8169);
        mpfr_init(r8170);
        mpfr_init(r8171);
        mpfr_init(r8172);
        mpfr_init(r8173);
        mpfr_init(r8174);
        mpfr_init(r8175);
        mpfr_init(r8176);
        mpfr_init(r8177);
        mpfr_init(r8178);
        mpfr_init(r8179);
        mpfr_init(r8180);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8157, phi1, MPFR_RNDN);
        mpfr_sin(r8158, r8157, MPFR_RNDN);
        mpfr_set_d(r8159, phi2, MPFR_RNDN);
        mpfr_sin(r8160, r8159, MPFR_RNDN);
        mpfr_mul(r8161, r8158, r8160, MPFR_RNDN);
        mpfr_cos(r8162, r8159, MPFR_RNDN);
        mpfr_cos(r8163, r8157, MPFR_RNDN);
        mpfr_mul(r8164, r8162, r8163, MPFR_RNDN);
        mpfr_exp(r8165, r8164, MPFR_RNDN);
        mpfr_set_d(r8166, lambda1, MPFR_RNDN);
        mpfr_sin(r8167, r8166, MPFR_RNDN);
        mpfr_set_d(r8168, lambda2, MPFR_RNDN);
        mpfr_sin(r8169, r8168, MPFR_RNDN);
        mpfr_mul(r8170, r8167, r8169, MPFR_RNDN);
        mpfr_cos(r8171, r8166, MPFR_RNDN);
        mpfr_cos(r8172, r8168, MPFR_RNDN);
        mpfr_mul(r8173, r8171, r8172, MPFR_RNDN);
        mpfr_add(r8174, r8170, r8173, MPFR_RNDN);
        mpfr_pow(r8175, r8165, r8174, MPFR_RNDN);
        mpfr_log(r8176, r8175, MPFR_RNDN);
        mpfr_add(r8177, r8161, r8176, MPFR_RNDN);
        mpfr_acos(r8178, r8177, MPFR_RNDN);
        mpfr_set_d(r8179, R, MPFR_RNDN);
        mpfr_mul(r8180, r8178, r8179, MPFR_RNDN);
        return mpfr_get_d(r8180, MPFR_RNDN);
}

