public class SinCalculator
{
const double PIMul2 = Math.PI * 2.0;
const double PIDiv2 = Math.PI / 2.0;
double[] _table;
double _coef;
public SinCalculator(int tableSize)
{
_coef = PIDiv2 / tableSize;
double[] table = new double[tableSize];
for (int i = 0; i < table.Length; ++i)
{
table[i] = Math.Sin(_coef * i);
}
_table = table;
}
public double Sin(double a)
{
// Используем свойства синуса для некоторого уменьшения размера таблицы.
// Если будет сильно медленно, то можно просто таблицу сделать побольше в 4 раза
if (a < 0) return -Sin(-a);
a = a - Math.Truncate(a / PIMul2) * PIMul2;
if (a > Math.PI) return -Sin(a - Math.PI);
if (a > PIDiv2) return Sin(Math.PI - a);
// Тут собственно возвращаем ближайшее из таблички
return _table[(int)Math.Round(a / _coef)]
}
}