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.
Revisão de 12h18min de 6 de março de 2026 por MegaManx3 (discussão | contribs) (Criou página com '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, pa...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)

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