16#define M_SQRT3_4 (0.866025403784438646764)
19#define NUM_TESTS (1000)
21static void utest_generate_rand_angle(
24static struct sin_cos_angle utest_compute_sin_cos_angle(double angle);
25static int utest_compare_double(
double a,
double b);
26static int utest_compare_size_t(
size_t a,
size_t b);
27static void utest_check_angle_sum_sub(
29 double ref_sum,
double ref_sub);
30static void utest_check_compare_angles(
double dble_angle_a,
double dble_angle_b,
42 double angles[] = {0.0, 0.24, 0.26, 0.5, 0.8, 1.0, 1.1, 1.5, 1.6, 1.9};
43 for (
size_t i = 0;
i <
sizeof(angles) /
sizeof(angles[0]); ++
i)
91 for (
size_t i = 0;
i <
sizeof(angles) /
sizeof(angles[0]); ++
i)
92 if (fabs(
compute_angle(utest_compute_sin_cos_angle(angles[i])) - angles[i]) >
94 PUT_ERR(
"error in compute_angle");
100 PUT_ERR(
"error in compute_angle");
105 for (
size_t i = 0;
i <
sizeof(angles)/
sizeof(angles[0]); ++
i) {
106 for (
size_t j = 0; j <
sizeof(angles)/
sizeof(angles[0]); ++j) {
108 {utest_compute_sin_cos_angle(angles[i]), utest_compute_sin_cos_angle(angles[j])};
109 utest_check_compare_angles(
110 angles[i], angles[j], temp_sin_cos_angles[0], temp_sin_cos_angles[1]);
115 double temp_angles[2];
117 for (
size_t j = 0; j < 2; ++j)
118 utest_generate_rand_angle(&(temp_angles[j]), &(temp_sin_cos_angles[j]));
119 for (
size_t j = 0; j < 2; ++j)
120 for (
size_t k = 0; k < 2; ++k)
121 utest_check_compare_angles(temp_angles[j], temp_angles[k],
122 temp_sin_cos_angles[j], temp_sin_cos_angles[k]);
125 for (
size_t i = 0;
i <
sizeof(sin_cos_angles)/
sizeof(sin_cos_angles[0]); ++
i) {
126 for (
size_t j = 0; j <
sizeof(sin_cos_angles)/
sizeof(sin_cos_angles[0]); ++j) {
129 int compare_ij = utest_compare_size_t(i, j);
130 if ((compare_ij !=
compare_angles(sin_cos_angles[i], sin_cos_angles[j])) ||
131 (compare_ij != utest_compare_double(temp[0], temp[1])))
132 PUT_ERR(
"error in compare_angles");
138 for (
size_t i = 0;
i <
sizeof(angles)/
sizeof(angles[0]); ++
i) {
139 for (
size_t j = 0; j <
sizeof(angles)/
sizeof(angles[0]); ++j) {
141 {utest_compute_sin_cos_angle(angles[i]), utest_compute_sin_cos_angle(angles[j])};
142 utest_check_angle_sum_sub(temp_sin_cos_angles[0], temp_sin_cos_angles[1],
143 angles[i] + angles[j], angles[i] - angles[j]);
148 double temp_angles[2];
150 for (
size_t j = 0; j < 2; ++j)
151 utest_generate_rand_angle(&(temp_angles[j]), &(temp_sin_cos_angles[j]));
152 for (
size_t j = 0; j < 2; ++j)
153 for (
size_t k = 0; k < 2; ++k)
154 utest_check_angle_sum_sub(
155 temp_sin_cos_angles[j], temp_sin_cos_angles[k],
156 temp_angles[j] + temp_angles[k], temp_angles[j] - temp_angles[k]);
161 for (
size_t i = 0;
i <
sizeof(angles)/
sizeof(angles[0]); ++
i)
162 if (fabs(angles[i] * 0.5 -
165 PUT_ERR(
"error in half_angle");
169 if (fabs(angle * 0.5 -
171 PUT_ERR(
"error in half_angle");
176 for (
size_t i = 0;
i <
sizeof(angles)/
sizeof(angles[0]); ++
i)
177 if (fabs(angles[i] * 0.25 -
180 PUT_ERR(
"error in quarter_angle");
187 if (fabs(angle * 0.25 -
189 PUT_ERR(
"error in quarter_angle");
196static void utest_generate_rand_angle(
199 *angle = (2.0 * M_PI) * ((
double)rand() / (double)RAND_MAX);
203static struct sin_cos_angle utest_compute_sin_cos_angle(double angle) {
205 double sin_angle =
sin(angle);
206 double cos_angle =
cos(angle);
210static int utest_compare_double(
double a,
double b) {
212 return (a > b) - (a < b);
215static int utest_compare_size_t(
size_t a,
size_t b) {
217 return (a > b) - (a < b);
220static void utest_check_angle_sum_sub(
222 double ref_sum,
double ref_sub) {
227 double angle_sum =
compute_angle(sum) + ((big_sum)?(2.0*M_PI):0.0);
234 double angle_sub =
compute_angle(sub) - ((neg)?(2.0*M_PI):0.0);
239static void utest_check_compare_angles(
double dble_angle_a,
double dble_angle_b,
243 int ret = utest_compare_double(dble_angle_a, dble_angle_b);
245 PUT_ERR(
"error in compare_angles");
248 if (ret != utest_compare_double(temp[0], temp[1]))
249 PUT_ERR(
"error in sin_cos_angle_to_dble");
static const struct sin_cos_angle SIN_COS_M_PI
static double sin_cos_angle_to_dble(struct sin_cos_angle angle)
static struct sin_cos_angle quarter_angle(struct sin_cos_angle angle)
static int compare_angles(struct sin_cos_angle a, struct sin_cos_angle b)
static int sub_angles(struct sin_cos_angle a, struct sin_cos_angle b, struct sin_cos_angle *restrict sub)
static double compute_angle(struct sin_cos_angle angle)
return angles in the range of [0;2PI[
static int sum_angles(struct sin_cos_angle a, struct sin_cos_angle b, struct sin_cos_angle *restrict sum)
static struct sin_cos_angle sin_cos_angle_new(double sin, double cos)
static struct sin_cos_angle half_angle(struct sin_cos_angle angle)