#include <math.h>
#include <stdio.h>
class SinCos
{
public:
SinCos()
{
double step = 6.28318530717958647692 / 4096.0f;
sinTable = new float[4099];
cosTable = new float[4099];
int index = 0;
for (double i = 0; i < 6.28318530717958647692; i += step)
{
sinTable[index] = sin(i);
cosTable[index] = cos(i);
index++;
}
maxIdx = index;
}
float getSin(float val)
{
val = fmod(val, 6.28318530717958647692);
return sinTable[(int)(4096.0f * val / 6.28318530717958647692)];
}
float getCos(float val)
{
val = fmod(val, 6.28318530717958647692);
return cosTable[(int)(4096.0f * val / 6.28318530717958647692)];
}
float maxSinDelta();
float maxCosDelta();
float* sinTable;
float* cosTable;
int maxIdx;
};
float SinCos::maxCosDelta()
{
float maxval = 0;
for(int i = 0; i < maxIdx; ++i)
{
float delta = fabs(cosTable[i] - cosTable[(i+1)%maxIdx]);
if (maxval < delta) maxval = delta;
}
return maxval;
}
float SinCos::maxSinDelta()
{
float maxval = 0;
for(int i = 0; i < maxIdx; ++i)
{
float delta = fabs(sinTable[i] - sinTable[(i+1)%maxIdx]);
if (maxval < delta) maxval = delta;
}
return maxval;
}
int main()
{
SinCos s;
printf("MaxDelte sin = %f, cos = %f\n", s.maxSinDelta(), s.maxCosDelta());
}
I2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CgpjbGFzcyBTaW5Db3MKewpwdWJsaWM6CiAgICBTaW5Db3MoKQogICAgewogICAgICAgIGRvdWJsZSBzdGVwID0gNi4yODMxODUzMDcxNzk1ODY0NzY5MiAvIDQwOTYuMGY7CiAgICAgICAgc2luVGFibGUgPSBuZXcgZmxvYXRbNDA5OV07CiAgICAgICAgY29zVGFibGUgPSBuZXcgZmxvYXRbNDA5OV07CiAgICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgICBmb3IgKGRvdWJsZSBpID0gMDsgaSA8IDYuMjgzMTg1MzA3MTc5NTg2NDc2OTI7IGkgKz0gc3RlcCkKICAgICAgICB7CiAgICAgICAgICAgIHNpblRhYmxlW2luZGV4XSA9IHNpbihpKTsKICAgICAgICAgICAgY29zVGFibGVbaW5kZXhdID0gY29zKGkpOwogICAgICAgICAgICBpbmRleCsrOwogICAgICAgIH0KICAgICAgICBtYXhJZHggPSBpbmRleDsKICAgIH0KCiAgICBmbG9hdCBnZXRTaW4oZmxvYXQgdmFsKQogICAgewogICAgICAgIHZhbCA9IGZtb2QodmFsLCA2LjI4MzE4NTMwNzE3OTU4NjQ3NjkyKTsKICAgICAgICByZXR1cm4gc2luVGFibGVbKGludCkoNDA5Ni4wZiAqIHZhbCAvIDYuMjgzMTg1MzA3MTc5NTg2NDc2OTIpXTsKICAgIH0KICAgIGZsb2F0IGdldENvcyhmbG9hdCB2YWwpCiAgICB7CiAgICAgICAgdmFsID0gZm1vZCh2YWwsIDYuMjgzMTg1MzA3MTc5NTg2NDc2OTIpOwogICAgICAgIHJldHVybiBjb3NUYWJsZVsoaW50KSg0MDk2LjBmICogdmFsIC8gNi4yODMxODUzMDcxNzk1ODY0NzY5MildOwogICAgfQoKICAgIGZsb2F0IG1heFNpbkRlbHRhKCk7CiAgICBmbG9hdCBtYXhDb3NEZWx0YSgpOwoKICAgIGZsb2F0KiBzaW5UYWJsZTsKICAgIGZsb2F0KiBjb3NUYWJsZTsKICAgIGludCBtYXhJZHg7Cn07CgpmbG9hdCBTaW5Db3M6Om1heENvc0RlbHRhKCkKewogICAgZmxvYXQgbWF4dmFsID0gMDsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtYXhJZHg7ICsraSkKICAgIHsKICAgICAgICBmbG9hdCBkZWx0YSA9IGZhYnMoY29zVGFibGVbaV0gLSBjb3NUYWJsZVsoaSsxKSVtYXhJZHhdKTsKICAgICAgICBpZiAobWF4dmFsIDwgZGVsdGEpIG1heHZhbCA9IGRlbHRhOwogICAgfQogICAgcmV0dXJuIG1heHZhbDsKfQoKZmxvYXQgU2luQ29zOjptYXhTaW5EZWx0YSgpCnsKICAgIGZsb2F0IG1heHZhbCA9IDA7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbWF4SWR4OyArK2kpCiAgICB7CiAgICAgICAgZmxvYXQgZGVsdGEgPSBmYWJzKHNpblRhYmxlW2ldIC0gc2luVGFibGVbKGkrMSklbWF4SWR4XSk7CiAgICAgICAgaWYgKG1heHZhbCA8IGRlbHRhKSBtYXh2YWwgPSBkZWx0YTsKICAgIH0KICAgIHJldHVybiBtYXh2YWw7Cn0KCgppbnQgbWFpbigpCnsKICAgIFNpbkNvcyBzOwogICAgcHJpbnRmKCJNYXhEZWx0ZSBzaW4gPSAlZiwgY29zID0gJWZcbiIsIHMubWF4U2luRGVsdGEoKSwgcy5tYXhDb3NEZWx0YSgpKTsKfQoK