elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Raiz Cuadrada sin math.h
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Raiz Cuadrada sin math.h  (Leído 20,834 veces)
edr89

Desconectado Desconectado

Mensajes: 105


Ver Perfil
[C] Raiz Cuadrada sin math.h
« en: 19 Mayo 2013, 08:22 am »

Hola,
Necesito calcular la raiz cuadrada de un numero, encontre en la red una funcion que no necesita de la libreria math.h, todo ejecuta pero no termino de entender el for loop de la raiz:
Código:
#include<stdio.h>
#include<conio.h>

float SquareRoot(float num);
void main()
        {
        int input;
        float square;
        printf("Escribe el numero: ");
        scanf("%d",&input);
            if(input<0)
            {
                printf("La raiz de un numero negativo no esta definida, por favor intenta de nuevo.");
            }

        square = SquareRoot(input);
        printf("\n La raiz de %d es: %.5f",input, square);
        getch();
        }

float SquareRoot(float num)
{
    float x = num;
    if(num >= 0)
        {
            int i;
            for(i = 0; i < 20; i ++)

            x = (((x * x) + num) / (2 * x));

            return x;
        }
}

¿Porqué i<20?, num es el dato que el usuario va a teclear que es = x, entonces mientras el loop corre ¿qué le pasa a x?

x1 = las operaciones indicadas con el dato que escribe el usuario.
x2 = las mismas operaciones ahora con el nuevo dato resultado de x1.
x3 = operaciones con el dato que se genero en x2.
xn = ...

es asi como sucede?

sospecho que la condicion en for() y la expresion de X se reducen a meras formulas matematicas, no recuerdo muy bien como resolver una raiz cuadrada con precision y cifras significativas.

Trato de pensar en alguna funcion que resuelva con dos numeros de raiz entera como (4, 9) para buscar raices en dicho intervalo. La cuestion es que no puedo usar sqrt() de math.h.

Sugerencias bienvenidas!


En línea

Shell Root
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.724


<3


Ver Perfil WWW
Re: [C] Raiz Cuadrada sin math.h
« Respuesta #1 en: 19 Mayo 2013, 08:29 am »

No se como será eso, pero se supone que expresar la raiz cuadrada de un numero es igual a la potenciación con exponente ½, es decir,




Más fácil por ahí?

:http://es.wikipedia.org/wiki/Ra%C3%ADz_cuadrada


En línea

Te vendería mi talento por poder dormir tranquilo.
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [C] Raiz Cuadrada sin math.h
« Respuesta #2 en: 19 Mayo 2013, 12:39 pm »

Hola,
Necesito calcular la raiz cuadrada de un numero, encontre en la red una funcion que no necesita de la libreria math.h, todo ejecuta pero no termino de entender el for loop de la raiz:

El 20del for es como un número mínimo de aproximaciones sucesivas. En realidad está mal implementado el código ya que en números pequeños se alcanza el valor correcto en la  tercerao cuarta iteración o aproximación, resultando inútiles las demás, dependiendo el número de aproximaciones del tamaño del numero. Más bien debería de comparar el valor de x calculado con el anterior y si son iguales se acaba.

Por ejemplo, la salida para raiz de 2 es:

Código
  1. Escribe el numero: 2
  2. La raiz de 2 es: 1.500000
  3. La raiz de 2 es: 1.416667
  4. La raiz de 2 es: 1.414216
  5. La raiz de 2 es: 1.414214
  6. La raiz de 2 es: 1.414214
  7. La raiz de 2 es: 1.414214
  8. La raiz de 2 es: 1.414214
  9. La raiz de 2 es: 1.414214
  10. La raiz de 2 es: 1.414214
  11. La raiz de 2 es: 1.414214
  12. La raiz de 2 es: 1.414214
  13. La raiz de 2 es: 1.414214
  14. La raiz de 2 es: 1.414214
  15. La raiz de 2 es: 1.414214
  16. La raiz de 2 es: 1.414214
  17. La raiz de 2 es: 1.414214
  18. La raiz de 2 es: 1.414214
  19. La raiz de 2 es: 1.414214
  20. La raiz de 2 es: 1.414214
  21. La raiz de 2 es: 1.414214
  22.  
  23. La raiz de 2 es: 1.41421

Fíjate que en la cuarta ya se tiene el valor deseado resultando inútiles las demás.


Citar
¿Porqué i<20?, num es el dato que el usuario va a teclear que es = x, entonces mientras el loop corre ¿qué le pasa a x?

x1 = las operaciones indicadas con el dato que escribe el usuario.
x2 = las mismas operaciones ahora con el nuevo dato resultado de x1.
x3 = operaciones con el dato que se genero en x2.
xn = ...

es asi como sucede?


Tal y com ves en la salida que te he puesto, es así.

Citar
sospecho que la condicion en for() y la expresion de X se reducen a meras formulas matematicas, no recuerdo muy bien como resolver una raiz cuadrada con precision y cifras significativas.

La condición del for es una chapuza, ya te comente que debería ser mejor con un while comparando valor actual y valor anterior, es un número el 20 de "mínimos" para asegurar la convergencia para números muy grandes, pero para números cortos es demasiado elevado. Y el valor de x es que el que resulta de un cálculo "a mano", mira en Wikipedia que lo explica bien.


Observa en cambio ésta salida y compárala con la original:

Código
  1. Escribe el numero: 2
  2. La raiz de 2 es: 1.500000
  3. La raiz de 2 es: 1.416667
  4. La raiz de 2 es: 1.414216
  5. La raiz de 2 es: 1.414214
  6. La raiz de 2 es: 1.414214
  7.  
  8. La raiz de 2 es: 1.41421


Como ves he comparado cada valor obtenido en cada iteración con el anterior y en el momento que son iguales paro. Me ahorro unas cuantitas iteraciones. Y el código, con una pequeña modificación para evitar bucles si en lugar de un número se introduce una letra:

Código
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3.  
  4. float SquareRoot(float num);
  5. void main()
  6.        {
  7.        int input,cont;
  8.        char ch;
  9.        float square;
  10.        do {
  11.            cont=0
  12.            printf("Escribe el numero: ");
  13.            cont=scanf("%d",&input);
  14.            while( (ch = getchar()) != '\n' );
  15.            if(input<=0)
  16.                printf("La raiz de un numero negativo no esta definida, por favor intenta de nuevo.\n");
  17.        }while (cont==0 || input<=0);
  18.        square = SquareRoot(input);
  19.        printf("\n La raiz de %d es: %.5f",input, square);
  20.        getch();
  21.        }
  22.  
  23. float SquareRoot(float num)
  24. {
  25.    float x = num,x1;
  26.    int i;
  27.    do{
  28.        x1=x;
  29.        x = (((x * x) + num) / (2 * x));
  30.        printf(" La raiz de %g es: %f\n",num, x);
  31.    }while (x!=x1);
  32.    return x;
  33. }
  34.  


Citar
Trato de pensar en alguna funcion que resuelva con dos numeros de raiz entera como (4, 9) para buscar raices en dicho intervalo. La cuestion es que no puedo usar sqrt() de math.h.

Tendrías que escanear dos números en lugar de uno y usando un for pasar los  números comprendidos entre esos dos a la función

y meter el código que te calculala raiz en un for que va desde num1 a num2. Una salida a esta opción sería:

Código
  1. Escribe el primer numero: 2
  2. Escribe el segundo numero: 16
  3.  
  4. La raiz de 2 es: 1.41421
  5. La raiz de 3 es: 1.73205
  6. La raiz de 4 es: 2.00000
  7. La raiz de 5 es: 2.23607
  8. La raiz de 6 es: 2.44949
  9. La raiz de 7 es: 2.64575
  10. La raiz de 8 es: 2.82843
  11. La raiz de 9 es: 3.00000
  12. La raiz de 10 es: 3.16228
  13. La raiz de 11 es: 3.31662
  14. La raiz de 12 es: 3.46410
  15. La raiz de 13 es: 3.60555
  16. La raiz de 14 es: 3.74166
  17. La raiz de 15 es: 3.87298
  18. La raiz de 16 es: 4.00000

con el siguiente código:

Código
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3.  
  4. float SquareRoot(float num);
  5. void main()
  6.        {
  7.        int flag1=0,flag2=0,num1,num2,cont1,cont2,i;
  8.        chat ch;
  9.        float square;
  10.        do {
  11.            cont1=cont2=flag1=flag2=0;
  12.            printf("Escribe el primer numero: ");
  13.            cont1=scanf("%d",&num1);
  14.            if (cont1==0)
  15.                flag1++;
  16.            while( (ch = getchar()) != '\n' );
  17.            printf("Escribe el segundo numero: ");
  18.            cont2=scanf("%d",&num2);
  19.            if (cont2==0)
  20.                flag1++;
  21.            while( (ch = getchar()) != '\n' );
  22.            if(num1<=0 || num2<=0){
  23.                printf("La raiz de un numero negativo no esta definida, por favor intenta de nuevo.\n");
  24.                flag2++;
  25.            }
  26.  
  27.        }while (flag1!=0 || flag2!=0);
  28.        for (i=num1;i<=num2;i++){
  29.            square = SquareRoot(i);
  30.            printf("\n La raiz de %d es: %.5f",i, square);
  31.        }
  32. }
  33.  
  34. float SquareRoot(float num)
  35. {
  36.    float x = num,x1;
  37.    int i;
  38.    do{
  39.        x1=x;
  40.        x = (((x * x) + num) / (2 * x));
  41.        //printf(" La raiz de %g es: %f\n",num, x);
  42.    }while (x!=x1);
  43.    return x;
  44.  
  45.  
  46.  
  47. }
  48.  

Está hecho a toda pastilla, por lo que habría que testearlo un poco a ver si falla o no, pero para que veas más o menos como sería la cosa.

Saluditos!. .... ..
« Última modificación: 11 Diciembre 2013, 15:45 pm por leosansan » En línea

edr89

Desconectado Desconectado

Mensajes: 105


Ver Perfil
Re: [C] Raiz Cuadrada sin math.h
« Respuesta #3 en: 19 Mayo 2013, 22:52 pm »

Está hecho a toda pastilla, por lo que habría que testearlo un poco a ver si falla o no, pero para que veas más o menos como sería la cosa.

Ambos códigos funcionan, el primero solo te faltó un cierre de instrucción, me has dejado boquiabierto!, lo reviso con tiempo para poder entenderlo, el segundo código era una idea solamente, en realidad el programa debe dar la raiz del numero tecleado, ademas que es un poco mas elaborado y no entiendo ciertas partes. :(

Estuve buscando sin exito como evitar el bucle infinito cuando se teclea un caracter y no un numero, tengo varios archivos con esa falla, con un do-while lo soluciono no?

Código:
do
{
...
}while( (ch = getchar()) != '\n' );

Saludos!!
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [C] Raiz Cuadrada sin math.h
« Respuesta #4 en: 19 Mayo 2013, 23:03 pm »


Estuve buscando sin exito como evitar el bucle infinito cuando se teclea un caracter y no un numero, tengo varios archivos con esa falla, con un do-while lo soluciono no?

Código:
do
{
...
}while( (ch = getchar()) != '\n' );


Es la forma más corriente de hacerlo, aunque puede estar más elaborada con una variable cont que cuente las lecturas que hace scanf, que es lo que utilizo en el código que te pase junto con el mencionada while. Realmente es una forma de limpiar lo que se llama buffer o memoria intermedia por decirlo a lo breve.

Saluditos! ..... ...nuevamente!!!!


 
En línea

edr89

Desconectado Desconectado

Mensajes: 105


Ver Perfil
Re: [C] Raiz Cuadrada sin math.h
« Respuesta #5 en: 20 Mayo 2013, 06:30 am »

Gracias.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Calcular raiz cuadrada
Programación Visual Basic
zered 5 7,035 Último mensaje 4 Noviembre 2007, 19:13 pm
por zered
Calcular la raíz cuadrada
Scripting
Meta 5 10,592 Último mensaje 30 Septiembre 2010, 18:16 pm
por Meta
Raiz cuadrada exacta
ASM
kch_l 2 9,479 Último mensaje 21 Enero 2011, 01:26 am
por Иōҳ
Raiz cuadrada en c « 1 2 »
Programación C/C++
JOSE23 11 27,224 Último mensaje 21 Febrero 2011, 18:06 pm
por JOSE23
Uso de raiz cuadrada en C#
.NET (C#, VB.NET, ASP)
Riudo 6 24,024 Último mensaje 28 Febrero 2011, 20:22 pm
por [D4N93R]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines