#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 r8018 = phi1;
        float r8019 = sin(r8018);
        float r8020 = phi2;
        float r8021 = sin(r8020);
        float r8022 = r8019 * r8021;
        float r8023 = cos(r8018);
        float r8024 = cos(r8020);
        float r8025 = r8023 * r8024;
        float r8026 = lambda1;
        float r8027 = lambda2;
        float r8028 = r8026 - r8027;
        float r8029 = cos(r8028);
        float r8030 = r8025 * r8029;
        float r8031 = r8022 + r8030;
        float r8032 = acos(r8031);
        float r8033 = R;
        float r8034 = r8032 * r8033;
        return r8034;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r8035 = phi1;
        double r8036 = sin(r8035);
        double r8037 = phi2;
        double r8038 = sin(r8037);
        double r8039 = r8036 * r8038;
        double r8040 = cos(r8035);
        double r8041 = cos(r8037);
        double r8042 = r8040 * r8041;
        double r8043 = lambda1;
        double r8044 = lambda2;
        double r8045 = r8043 - r8044;
        double r8046 = cos(r8045);
        double r8047 = r8042 * r8046;
        double r8048 = r8039 + r8047;
        double r8049 = acos(r8048);
        double r8050 = R;
        double r8051 = r8049 * r8050;
        return r8051;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r8052 = phi1;
        float r8053 = sin(r8052);
        float r8054 = phi2;
        float r8055 = sin(r8054);
        float r8056 = r8053 * r8055;
        float r8057 = cos(r8052);
        float r8058 = cos(r8054);
        float r8059 = r8057 * r8058;
        float r8060 = lambda1;
        float r8061 = cos(r8060);
        float r8062 = lambda2;
        float r8063 = cos(r8062);
        float r8064 = r8061 * r8063;
        float r8065 = r8059 * r8064;
        float r8066 = sin(r8060);
        float r8067 = sin(r8062);
        float r8068 = r8066 * r8067;
        float r8069 = r8059 * r8068;
        float r8070 = r8065 + r8069;
        float r8071 = r8056 + r8070;
        float r8072 = acos(r8071);
        float r8073 = R;
        float r8074 = r8072 * r8073;
        return r8074;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r8075 = phi1;
        double r8076 = sin(r8075);
        double r8077 = phi2;
        double r8078 = sin(r8077);
        double r8079 = r8076 * r8078;
        double r8080 = cos(r8075);
        double r8081 = cos(r8077);
        double r8082 = r8080 * r8081;
        double r8083 = lambda1;
        double r8084 = cos(r8083);
        double r8085 = lambda2;
        double r8086 = cos(r8085);
        double r8087 = r8084 * r8086;
        double r8088 = r8082 * r8087;
        double r8089 = sin(r8083);
        double r8090 = sin(r8085);
        double r8091 = r8089 * r8090;
        double r8092 = r8082 * r8091;
        double r8093 = r8088 + r8092;
        double r8094 = r8079 + r8093;
        double r8095 = acos(r8094);
        double r8096 = R;
        double r8097 = r8095 * r8096;
        return r8097;
}

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 r8098, r8099, r8100, r8101, r8102, r8103, r8104, r8105, r8106, r8107, r8108, r8109, r8110, r8111, r8112, r8113, r8114;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1872);
        mpfr_init(r8098);
        mpfr_init(r8099);
        mpfr_init(r8100);
        mpfr_init(r8101);
        mpfr_init(r8102);
        mpfr_init(r8103);
        mpfr_init(r8104);
        mpfr_init(r8105);
        mpfr_init(r8106);
        mpfr_init(r8107);
        mpfr_init(r8108);
        mpfr_init(r8109);
        mpfr_init(r8110);
        mpfr_init(r8111);
        mpfr_init(r8112);
        mpfr_init(r8113);
        mpfr_init(r8114);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8098, phi1, MPFR_RNDN);
        mpfr_sin(r8099, r8098, MPFR_RNDN);
        mpfr_set_d(r8100, phi2, MPFR_RNDN);
        mpfr_sin(r8101, r8100, MPFR_RNDN);
        mpfr_mul(r8102, r8099, r8101, MPFR_RNDN);
        mpfr_cos(r8103, r8098, MPFR_RNDN);
        mpfr_cos(r8104, r8100, MPFR_RNDN);
        mpfr_mul(r8105, r8103, r8104, MPFR_RNDN);
        mpfr_set_d(r8106, lambda1, MPFR_RNDN);
        mpfr_set_d(r8107, lambda2, MPFR_RNDN);
        mpfr_sub(r8108, r8106, r8107, MPFR_RNDN);
        mpfr_cos(r8109, r8108, MPFR_RNDN);
        mpfr_mul(r8110, r8105, r8109, MPFR_RNDN);
        mpfr_add(r8111, r8102, r8110, MPFR_RNDN);
        mpfr_acos(r8112, r8111, MPFR_RNDN);
        mpfr_set_d(r8113, R, MPFR_RNDN);
        mpfr_mul(r8114, r8112, r8113, MPFR_RNDN);
        return mpfr_get_d(r8114, MPFR_RNDN);
}

static mpfr_t r8115, r8116, r8117, r8118, r8119, r8120, r8121, r8122, r8123, r8124, r8125, r8126, r8127, r8128, r8129, r8130, r8131, r8132, r8133, r8134, r8135, r8136, r8137;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1872);
        mpfr_init(r8115);
        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);
        mpfr_init(r8133);
        mpfr_init(r8134);
        mpfr_init(r8135);
        mpfr_init(r8136);
        mpfr_init(r8137);
}

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

static mpfr_t r8138, r8139, r8140, r8141, r8142, r8143, r8144, r8145, r8146, r8147, r8148, r8149, r8150, r8151, r8152, r8153, r8154, r8155, r8156, r8157, r8158, r8159, r8160;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1872);
        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);
        mpfr_init(r8157);
        mpfr_init(r8158);
        mpfr_init(r8159);
        mpfr_init(r8160);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r8138, phi1, MPFR_RNDN);
        mpfr_sin(r8139, r8138, MPFR_RNDN);
        mpfr_set_d(r8140, phi2, MPFR_RNDN);
        mpfr_sin(r8141, r8140, MPFR_RNDN);
        mpfr_mul(r8142, r8139, r8141, MPFR_RNDN);
        mpfr_cos(r8143, r8138, MPFR_RNDN);
        mpfr_cos(r8144, r8140, MPFR_RNDN);
        mpfr_mul(r8145, r8143, r8144, MPFR_RNDN);
        mpfr_set_d(r8146, lambda1, MPFR_RNDN);
        mpfr_cos(r8147, r8146, MPFR_RNDN);
        mpfr_set_d(r8148, lambda2, MPFR_RNDN);
        mpfr_cos(r8149, r8148, MPFR_RNDN);
        mpfr_mul(r8150, r8147, r8149, MPFR_RNDN);
        mpfr_mul(r8151, r8145, r8150, MPFR_RNDN);
        mpfr_sin(r8152, r8146, MPFR_RNDN);
        mpfr_sin(r8153, r8148, MPFR_RNDN);
        mpfr_mul(r8154, r8152, r8153, MPFR_RNDN);
        mpfr_mul(r8155, r8145, r8154, MPFR_RNDN);
        mpfr_add(r8156, r8151, r8155, MPFR_RNDN);
        mpfr_add(r8157, r8142, r8156, MPFR_RNDN);
        mpfr_acos(r8158, r8157, MPFR_RNDN);
        mpfr_set_d(r8159, R, MPFR_RNDN);
        mpfr_mul(r8160, r8158, r8159, MPFR_RNDN);
        return mpfr_get_d(r8160, MPFR_RNDN);
}

