У меня есть следующий код, выполняющий функцию Sin/Cos, используя предварительно рассчитанную таблицу памяти. в следующем примере таблица имеет 1024 * 128 элементов, охватывающих все значения Sin/Cos от 0 до 2pi. Я знаю, что могу использовать симметрию Sin/Cos и удерживать только 1/4 значений, но их у меня будет больше "ifs" при вычислении значения.
private const double PI2 = Math.PI * 2.0;
private const int TABLE_SIZE = 1024 * 128;
private const double TABLE_SIZE_D = (double)TABLE_SIZE;
private const double FACTOR = TABLE_SIZE_D / PI2;
private static double[] _CosineDoubleTable;
private static double[] _SineDoubleTable;
Установите таблицу переводов
private static void InitializeTrigonometricTables(){
_CosineDoubleTable = new double[TABLE_SIZE];
_SineDoubleTable = new double[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++){
double Angle = ((double)i / TABLE_SIZE_D) * PI2;
_SineDoubleTable[i] = Math.Sin(Angle);
_CosineDoubleTable[i] = Math.Cos(Angle);
}
}
Значение представляет собой double в радианах.
Value %= PI2; // In case that the angle is larger than 2pi
if (Value < 0) Value += PI2; // in case that the angle is negative
int index = (int)(Value * FACTOR); //from radians to index and casted in to an int
double sineValue = _SineDoubleTable[index]; // get the value from the table
Я ищу более быстрый способ сделать это. Вышеуказанные 4 строки составляют ~ 25% от всего процесса (выполняются миллиарды раз).