FixedSqrt
Mais ações
int Sqrt (int number)
fixed FixedSqrt (fixed number)
Uso
Retorna a raiz quadrada de um número inteiro ou de ponto fixo.
Parâmetros
- number: Valor do qual obter a raiz quadrada.
Valor de retorno
Ou a raiz quadrada arredondada do número como inteiro, ou como ponto fixo.
Cálculo manual
Em versões antigas do ZDoom, a função não é embutida no ACS, então aqui estão várias que funcionam bem. Note que, para a distância entre dois objetos, a função distance pode ser mais rápida.
Esta versão usa o método de Newton, em que a solução converge quadraticamente a partir do chute inicial. Esta função foi comparada com as duas seguintes e é pelo menos 5 a 10 vezes mais rápida em uso normal.
function int sqrt(int number)
{
if(number <= 3) { return number > 0; }
int oldAns = number >> 1, // chute inicial
newAns = (oldAns + number / oldAns) >> 1; // primeira iteração
// método iterativo principal
while(newAns < oldAns)
{
oldAns = newAns;
newAns = (oldAns + number / oldAns) >> 1;
}
return oldAns;
}
Esta é uma versão mais simples, porém mais lenta, de uma função de raiz quadrada. Ela arredonda a raiz para cima ou para baixo.
function int sqrt (int x)
{
int r;
x = x + 1 >> 1;
while (x > r)
x -= r++;
return r;
}
Se você precisar de uma função que arredonde para baixo, esta funcionará. Baseada em este algoritmo.
function int isqrt (int n)
{
int a;
for (a=0;n>=(2*a)+1;n-=(2*a++)+1);
return a;
}
Esta fórmula baseada em amostragem processa valores fixos e retorna um resultado fixo cuja precisão é definida pelo inteiro samples, e retorna zero se o número de entrada for negativo.
function int sqrt(int number)
{
int samples=15; // Amostras para precisão
if (number == 1.0) return 1.0;
if (number <= 0) return 0;
int val = samples<<17 + samples<<19; //x*10 = x<<1 + x<<3
for (int i=0; i<samples; i++)
val = (val + FixedDiv(number, val)) >> 1;
return val;
}
Este é o mesmo de cima, mas otimizado para 15 amostras
function int sqrt(int number)
{
if (number == 1.0) return 1.0;
if (number <= 0) return 0;
int val = 150.0;
for (int i=0; i<15; i++)
val = (val + FixedDiv(number, val)) >> 1;
return val;
}