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
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() mostrando_lingua.png 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 smile.png

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 nao_quero_nem_ver.png 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 big_green.png
Ricardo "Fang MoonRupt"
< Archlinux User >
pflynn
pflynn Ubbergeek Registrado
5.5K Mensagens 122 Curtidas
#5 Por pflynn
20/11/2008 - 22:26
RR_Fang disse:
Não há o operador " ^ " na linguagem C padrão...


Só um adendo: existe sim o operador representado por ^ na linguagem C: trata-se do operador binário "ou exclusivo" no nível dos bits (bitwise XOR, na notação em inglês).
------------------------------------------------
Muito bom. Mas tijolo não revida!
------------------------------------------------
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. isso_ai.png

Problema resolvido, agradeço a todos pela atenção.
" GNU é um único sistema operacional, Linux é apenas um dos seus núcleos. "
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal