Это должно быть довольно чертовски быстро, если вы можете оптимизировать его дальше, пожалуйста, сделайте и опубликуйте код, например, pastie.org или что-то в этом роде.
Технические характеристики компьютера -> 512 МБ Ram, Visual Studio 2010, Windows XP Professional SP3 версии 2002, Intel (R) Pentium (R) 4 CPU 2.8GHZ.
Это безумно точная информация и в некоторых ситуациях даст несколько лучшие результаты. Например. 90, 180, 270 градусов в C++ возвращает не десятичное число.
ПОЛНАЯ ТАБЛИЦА 0 до 359 градусов по: https://pastee.org/dhwbj
ФОРМАТ -> СТЕПЕНЬ # -> MINE_X (#), CosX (#), MINE_Z (#), SinZ (#).
Ниже приведен код, используемый для построения вышеуказанной таблицы. Возможно, вы сделаете это еще более точным, если используете более крупный тип данных. Я использовал unsigned short и сделал N/64000. Итак, что всегда cos (##) и sin (##), где ближайший к I округлен до этого индекса. Я также попытался использовать как можно больше дополнительных данных, поэтому это не будет какая-то загроможденная таблица с 720 значениями float для cos и sin. Это, вероятно, даст лучшие результаты, но будет полной потерей памяти. Таблица ниже настолько мала, насколько я мог это сделать. Я хотел бы посмотреть, можно ли сделать уравнение, которое может округлить до всех этих коротких значений и использовать это вместо этого. Я не уверен, что это будет быстрее, но это полностью устранит таблицу и, вероятно, не уменьшит скорость ничем и не будет.
Таким образом, точность по сравнению с операциями C++ cos/sin составляет 99,99998% на 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;
}
SPEEDS BELOW, используя первоначально упомянутые технические характеристики компьютера. Я запускал его в режиме отладки до того, как это режим отладки, но запускается через исполняемый файл, который, я считаю, отлаживается без отладки.
МОЙ МЕТОД
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 МЕТОД
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.
Итак, подведем итог выше выполнения как соз (###) и грех (###) с моим стратегия позволяет примерно 220 000 000 казней в секунду. Использование исходных данных компьютера. Это довольно быстро и использует очень мало памяти, поэтому это отличный заменитель математических функций cos/sin, которые обычно встречаются на C++. Если вы хотите, чтобы точность открыла ссылку, показанную выше, и есть распечатка с градусами 0 по 359.Также это поддерживает от 0 до 89 и квадранты с 0 по 3. Поэтому вам нужно либо использовать это, либо выполнять (DEGREES% 90).
Большинство быстро трансценденталов ориентированы на игровые движки, которые не очень заботятся о точности. Насколько важна точность вашей проблемы? –
Профиль первым. «может дать некоторый дополнительный процент» не стоит пытаться оптимизировать. – pmr
@pmr: Как указано в моем вопросе, я профилирую, и из этого мое ожидание будет «пару процентов» во время исполнения - возможно, 2% или 3%, но это очень грубая оценка. Но с временем выполнения порядка дней, любой процент, который я могу получить, действительно может стоить того. – janitor048