blob: 715df30251ce14ca9c9f858ba64dc0398820acc6 [file]
/*
* Copyright (c) 2012 The Native Client Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void sincos(double a, double *s, double *c);
void sincosf(float a, float *s, float *c);
int TestSinCosD(double a) {
const double maxerr = 0.000000000001;
double sincos_sin, sincos_cos, sin_sin, cos_cos;
sincos(a, &sincos_sin, &sincos_cos);
sin_sin = sin(a);
cos_cos = cos(a);
if (fabs(sincos_sin - sin_sin) > maxerr ||
fabs(sincos_cos - cos_cos) > maxerr) {
printf("sincosf(%12.12f) outside tolerance: sin:%12.12f, cos:%12.12f\n",
a, sincos_sin - sin_sin, sincos_cos - cos_cos);
return 1;
} else {
return 0;
}
}
int TestSinCosF(float a) {
const float maxerr = 0.000000000001;
float sincos_sin, sincos_cos, sin_sin, cos_cos;
sincosf(a, &sincos_sin, &sincos_cos);
sin_sin = sinf(a);
cos_cos = cosf(a);
if (fabsf(sincos_sin - sin_sin) > maxerr ||
fabsf(sincos_cos - cos_cos) > maxerr) {
printf("sincosf(%12.12f) outside tolerance: sin:%12.12f, cos:%12.12f\n",
a, sincos_sin - sin_sin, sincos_cos - cos_cos);
return 1;
} else {
return 0;
}
}
int main(int argc, char* argv[]) {
const double pi = 3.14159265;
const double fourpi = 4.0 * pi;
double a;
int i;
int sawproblem = 0;
for (a = -fourpi; a < fourpi; a += pi / 8.0) {
sawproblem |= TestSinCosD(a);
sawproblem |= TestSinCosF(a);
}
/* seed drand48() generator to make it deterministic. */
srand48(12345678);
for (i = 0; i < 100; i++) {
sawproblem |= TestSinCosD(fourpi * (drand48() - 0.5));
sawproblem |= TestSinCosF(drand48());
}
if (!sawproblem) {
printf("No problems!\n");
}
return 0;
}