Logo Hardware.com.br
f12
f12 Membro Senior Registrado
321 Mensagens 25 Curtidas

[Resolvido] calcular raiz quadrada sem usar o "math.h"

#1 Por f12 20/11/2008 - 21:09

eae pessoal, tudo beleza?

minha dúvida é se existe alguma forma de calcular a raiz quadrada em "C" sem usar a biblioteca "math.h" (sei que é possivel usando essa biblioteca), só usando o "stdio.h", tem jeito?


#include <stdio.h>

main(){
int a, b;
scanf("%d",&a);

b = a ^0.5;

printf("%d\n",b);
return 0;

}
resultado:

$ gcc raiz.c -o raiz
$ ./raiz

raiz.c: In function ?main?:
raiz.c:7: error: invalid operands to binary ^ (have ?int? and ?double?)

Responder Tópico
jose_silva_neto
jose_silva_n... General de Pijama Registrado
4.6K Mensagens 98 Curtidas
#3 Por jose_silva_n...
20/11/2008 - 21:55

Boa noite,

Implemente a relação de recorrência obtida usando o método de Newton-Raphson ---> http://en.wikipedia.org/wiki/Newton_method


x_{n+1} = x_{n}/2 + a/2x_{n} com n >= 0
O x_{0} é o valor inicial para a raiz (do número a , positivo), existem alguns detalhes do método que você vai entender lendo o verbete da wikipedia que indiquei acima.


Fique com Deus

PS: sinto muito pela notação, aqui é um fórum de informática, não de ciência, portanto, não dispomos de um interpretador Latex para escrevermos fórmulas adequadamente.

RR_Fang
RR_Fang Super Participante Registrado
430 Mensagens 39 Curtidas
#4 Por RR_Fang
20/11/2008 - 22:00

Não há o operador " ^ " na linguagem C padrão, mas para isso há no math.h a função pow() Nada te impede de recriar funções disponíveis no math.h, mas na prática isso dificilmente será preciso. Ainda assim, sempre é válido experimentar com algo por aprendizado

Uma forma matemática bem popular de se calcular a raiz quadrada é o método da iteração de Newton ( http://pt.wikipedia.org/wiki/Método_de_Newton ), que aproxima a raiz quadrada para um número "suficientemente próximo" à aplicação.

Esse método foi imortalizado no código fonte do Doom 3, creditado a John Carmack mesmo não sendo o primeiro a utilizar desse método e sendo discutível a autoria do código ( http://www.beyond3d.com/content/articles/8/ ). O código aproxima-se mais de um hack, mas o seguinte artigo o explica bem: http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/


EDIT: Quis elaborar demais o post e enfim já postaram isso Mas ainda vale a pena os links como uma curiosidade

EDIT2: Puts, há sim o operador " ^ " em C, mas não como operador de potenciação... Valeu pela correção pflynn

jose_silva_neto
jose_silva_n... General de Pijama Registrado
4.6K Mensagens 98 Curtidas
#8 Por jose_silva_n...
22/11/2008 - 22:23

Boa noite,

f12 disse:
como implementar essa expressão nesse código que postei?


O código a seguir não é óptimo (fiz rapidamente), mesmo assim, espero que seja útil:


#include <stdio.h>

float raiz_quadrada(float numero);

int main( int argc, char **argv)
{
float numero;

printf("Entre com um número positivo por favor : &quot;
scanf("%f",&numero);

printf("A raiz quadrada de %.3f é %.5f \n",numero,raiz_quadrada(numero));

return(0);
}


float raiz_quadrada (float numero)
{
int n;
float recorre = numero;

for (n = 0; n < 10; ++n)
recorre = recorre/2 + numero/(2*recorre);

return(recorre);
}
Para compilar


gcc -W -Wall raiz.c -o raiz


Para executar:


./raiz


f12 disse:
Na linguagem C não existe potênciação?

Sim existe, é a função pow da math.h
http://en.wikipedia.org/wiki/Math.h



Fique com Deus

f12
f12 Membro Senior Registrado
321 Mensagens 25 Curtidas
#10 Por f12
23/11/2008 - 14:39

Mas porque sem a math.h? Pra que tanto trabalho?

é só para conhecimento mesmo, nada de mais.

#include <stdio.h>

float raiz_quadrada(float numero);

int main( int argc, char **argv)
{
float numero;

printf("Entre com um número positivo por favor : &quot;
scanf("%f",&numero);

printf("A raiz quadrada de %.3f é %.5f \n",numero,raiz_quadrada(numero));

return(0);
}


float raiz_quadrada (float numero)
{
int n;
float recorre = numero;

for (n = 0; n < 10; ++n)
recorre = recorre/2 + numero/(2*recorre);

return(recorre);
}

era exatamente o que eu precisava.

Problema resolvido, agradeço a todos pela atenção.

Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.