При реализации "Carmack's Inverse Square Root" algorithm я заметил, что результаты кажутся предвзятыми. Этот код дает лучшие результаты:Исправлен алгоритм обратного квадратного корня Carmack/Welsh
float InvSqrtF(float x)
{
// Initial approximation by Greg Walsh.
int i = * (int*) &x;
i = 0x5f3759df - (i >> 1);
float y = * (float *) &i;
// Two iterations of Newton-Raphson's method to refine the initial estimate.
x *= 0.5f;
float f = 1.5F;
y = y * (f - (x * y * y));
y = y * (f - (x * y * y));
* (int *)(&y) += 0x13; // More magic.
return y;
}
Главное отличие в предпоследней «более волшебной» линии. Поскольку исходные результаты были слишком низкими с помощью довольно постоянного коэффициента, это добавляет 19 * 2^(показатель (y) -bias) к результату только с одной инструкцией. Кажется, мне дают около 3 дополнительных бит, но я что-то пропускаю?
Именно в чем вопрос? «Нужно добавить 19 номеров?» или что-то другое? –
Не этот код обречен на неопределенное поведение по строжайшему правилу псевдонимов? – comocomocomocomo
@MatsPetersson: Первая часть алгоритма относится к восьмидесятым годам, и в первом приближении было проведено большое исследование лучших магических констант. Многие люди смотрели на него раньше. Поэтому я не доверяю себе 100%. Спускаю ли я что-то, что они видели? Это более вероятно, чем все они игнорируют это улучшение. – MSalters