Ativa o menu
Alternar menu de preferências
Alternar menu pessoal
Não autenticado(a)
Your IP address will be publicly visible if you make any edits.

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; 
}