Это должно быть чертовски быстро, если вы можете оптимизировать его, пожалуйста, сделайте это и напишите код на pastie.org или что-то в этом роде.
Характеристики компьютера -> 512 МБ Ram, Visual Studio 2010, Windows XP Professional SP3Версия 2002, процессор Intel® Pentium® 4 с тактовой частотой 2,8 ГГц.
Это безумно точно и в некоторых ситуациях дает немного лучшие результаты.Например, 90, 180, 270 градусов в C ++ возвращают не 0 десятичное число.
ПОЛНАЯ ТАБЛИЦА от 0 до 359 градусов: https://pastee.org/dhwbj
FORMAT -> DEGREE # -> MINE_X (#),CosX (#), MINE_Z (#), SinZ (#).
Ниже приведен код, использованный для построения показанной выше таблицы.Возможно, вы сможете сделать его еще более точным, если будете использовать больший тип данных.Я использовал неподписанный шорт и сделал N / 64000.Так что когда кос (##) и грех (##) где ближе всего я округлил до этого индекса.Я также попытался использовать как можно меньше дополнительных данных, чтобы это не была загроможденная таблица с 720 значениями с плавающей запятой для cos и sin.Что, вероятно, даст лучшие результаты, но будет пустой тратой памяти.Таблица ниже настолько мала, насколько я мог это сделать.Я хотел бы посмотреть, возможно ли составить уравнение, которое могло бы округлять до всех этих коротких значений и использовать его вместо этого.Я не уверен, что это будет быстрее, но это полностью исключит таблицу и, вероятно, не уменьшит скорость ни на что, ни на многое.
Таким образом, точность по сравнению с операциями C ++ cos / sin составляет 99,999998%.до 100%.
Ниже приведена таблица, используемая для расчета значений cos / sin.
static const unsigned __int16 DEGREE_LOOKUP_TABLE[91] =
{
64000, 63990, 63961, 63912, 63844, 63756,
63649, 63523, 63377, 63212, 63028, 62824,
62601, 62360, 62099, 61819, 61521, 61204,
60868, 60513, 60140, 59749, 59340, 58912,
58467, 58004, 57523, 57024, 56509, 55976,
55426, 54859, 54275, 53675, 53058, 52426,
51777, 51113, 50433, 49737, 49027, 48301,
47561, 46807, 46038, 45255, 44458, 43648,
42824, 41988, 41138, 40277, 39402, 38516,
37618, 36709, 35788, 34857, 33915, 32962,
32000, 31028, 30046, 29055, 28056, 27048,
26031, 25007, 23975, 22936, 21889, 20836,
19777, 18712, 17641, 16564, 15483, 14397,
13306, 12212, 11113, 10012, 8907, 7800,
6690, 5578, 4464, 3350, 2234, 1117,
0,
};
Ниже приведен фактический код, выполняющий вычисления cos / sin.
int deg1 = (int)degrees;
int deg2 = 90 - deg1;
float module = degrees - deg1;
double vX = DEGREE_LOOKUP_TABLE[deg1] * 0.000015625;
double vZ = DEGREE_LOOKUP_TABLE[deg2] * 0.000015625;
double mX = DEGREE_LOOKUP_TABLE[deg1 + 1] * 0.000015625;
double mZ = DEGREE_LOOKUP_TABLE[deg2 - 1] * 0.000015625;
float vectorX = vX + (mX - vX) * module;
float vectorZ = vZ + (mZ - vZ) * module;
if (quadrant & 1)
{
float tmp = vectorX;
if (quadrant == 1)
{
vectorX = -vectorZ;
vectorZ = tmp;
} else {
vectorX = vectorZ;
vectorZ = -tmp;
}
} else if (quadrant == 2) {
vectorX = -vectorX;
vectorZ = -vectorZ;
}
СКОРОСТИ НИЖЕ, используя первоначально упомянутые технические характеристики компьютера.Я запускал его в режиме отладки, прежде чем это был режим отладки, но запускался через исполняемый файл, который я считаю отладкой без отладки.
МОЙ МЕТОД
1,000 Iterations -> 0.004641 MS or 4641 NanoSeconds.
100,000 Iterations -> 4.4328 MS.
100,000,000 Iterations -> 454.079 MS.
1,000,000,000 Iterations -> 4065.19 MS.
COS / SIN METHOD
1,000 Iterations -> 0.581016 MS or 581016 NanoSeconds.
100,000 Iterations -> 25.0049 MS.
100,000,000 Iterations -> 24,731.6 MS.
1,000,000,000 Iterations -> 246,096 MS.
Итак, чтобы подвести итог вышесказанному, выполнение как cos (###), так и sin (###) с моей стратегией позволяет примерно 220 000 000 выполнений в секунду.Используя спецификации компьютера, показанные первоначально.Это довольно быстро и использует очень мало памяти, так что это отличная замена математическим функциям cos / sin, обычно встречающимся в C ++.Если вы хотите увидеть точность, откройте ссылку, показанную выше, и есть распечатка градусов от 0 до 359. Также это поддерживает от 0 до 89 и квадранты от 0 до 3. Поэтому вам нужно либо использовать это, либо выполнить (СТЕПЕНИ% 90).