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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda calcular raiz cuadrada sin sqrt C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda calcular raiz cuadrada sin sqrt C++  (Leído 8,445 veces)
seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Duda calcular raiz cuadrada sin sqrt C++
« en: 21 Julio 2015, 11:25 am »

Buenas, soy estudiante de Ingeniería de primer año. Si, estoy estudiando en verano para recuperar Programación.

La duda es que tengo un problema en el que una de las cosas que se me pide es calcular una raiz cuadrada sin usar sqrt.

Este es mi codigo, estaba comprobando lo que pasaba dentro del bucle while, ya que en la ejecución le de el valor que le de a num cae siempre en bucle infinito de ceros.
Mi idea era que el bucle se ejecutase mientras num-res>=0,0001 (res= resultado de la raiz cuadrada aproximandonos por tanteo) y que por tanto, saliera del bucle cuando tuviera un res valido aproximado al valor real de la raiz cuadrada de num.

Código:
int main(){
    int num;
    double res=0.000;
    cin>>num;

    while((num-res)>=0,001){
        res+=0,001;
        cout<<res<<endl;
}


return 0;
}




En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda calcular raiz cuadrada sin sqrt C++
« Respuesta #1 en: 21 Julio 2015, 12:58 pm »

No sería (num-res*res)>=0.001?


En línea

user-marcos

Desconectado Desconectado

Mensajes: 159


Ver Perfil
Re: Duda calcular raiz cuadrada sin sqrt C++
« Respuesta #2 en: 21 Julio 2015, 14:25 pm »

Aquí tienes una solución como siempre en c++ hay n posibles.

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(){
  5.    int num;
  6.    double res = 0.00;
  7.    const float INCREMENTO = 0.00001;
  8.    cin >> num;
  9.  
  10.    while(res += INCREMENTO, res*res < num)
  11.      continue;
  12.  
  13.    cout << (res += -INCREMENTO);//hay que corregir un incremento
  14.  
  15. return 0;
  16. }
  17.  
En línea

seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Re: Duda calcular raiz cuadrada sin sqrt C++
« Respuesta #3 en: 21 Julio 2015, 15:04 pm »

Señores, gracias olvidadLo... tenia bien la condicion del while, la cambié y la puse mal, tal y como os he copiado...

El gran error de noob que he cometido ha sido poner comas en los numeros en vez de puntos, por eso no funcionaba....


Problema resuelto, gracias!

Pongo el código que he usado yo:

Código:
#include <iostream>
using namespace std;


int main(){
    int num;
    double res=0.000;
    cin>>num;


    while((num-res*res)>=0.001){
        res+=0.001;
        cout<<res<<endl;
}


return 0;
}

« Última modificación: 21 Julio 2015, 15:34 pm por seryioo » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Duda calcular raiz cuadrada sin sqrt C++
« Respuesta #4 en: 26 Julio 2015, 10:10 am »

¡Buenas!

Ese algoritmo tiene bastantes pegas, si el número cuya raíz cuadrada quieres calcular es menor que 10-6 te devolverá el mismo número, luego dependiendo de la precisión que utilices no estarás calculando la raíz cuadrada de nada, además ten en cuenta que si el número es de orden de k·10n, en m iteraciones tendrás una aproximacion m·10-3 y la comparación seria: k·10n - m210-6 >=10-3, luego para llegar a una aproximación con un error menor que el indicado tendrías que realizar (k·10n+6 - 103)1/2 operaciones (quédate con la parte entera mas uno), por poner un ejemplo, para calcular la raíz cuadrada de 104 tendrías que realizar unas 105= 100.000 iteraciones.

Ya que estás estudiando ingeniería puedes intentar usar un poco ese cerebro que Dios te ha dado y utilizar algo más efectivo, como el teorema de Bolzano (no entro en otros métodos numéricos, ya que en cualquier curso básico de análisis se estudia Bolzano, y con esto es suficiente), que deberías conocer, pero por si no te acuerdas aquí te dejo el enunciado:

Si una función continua sobre un intervalo J tiene signos opuestos evaluada en sus extremos, entonces existe al menos un punto en J cuya imagen es cero.

Es decir, si f:J=[a,b]---->R cumple que f(a)·f(b) < 0 => existe un número real c, a < c < b, tal que f(c)=0.

En este caso tienes la función f(x)=a-x2, ya que si a-x2=0 entonces x=sqrt(a).

Así, si a = 1 ó a = 0, ya tienes la solución. Si a > 1 a > squrt(a) > 1 y tendrás que buscar la solución en el intervalo inicial [1,a], y si 0 < a < 1 a < sqrt(a) < 1 y el intervalo inicial será [a,1],

Sea cual sea el intervalo inicial lo llamaremos [a0,b0] y sabemos que f(a0)·f(b0) < 0. así que escogemos m0=(a0+b0)/2

Si f(m0) <= error_aceptado ya tenemos la solución buscada, sino, estaremos en uno de los dos siguientes casos:

- f(a0)·f(m0) < 0: En este caso hacemos a1=a0, b1=m0

-f(m0)·f(b0) < 0: Y hacemos a1=m0, b1=b0

Y aplicamos el proceso anterior al nuevo intervalo [a1,b1]

Tras el paso n, la longitud del intervalo [an,bn] será (b0-a0)·2-n, así que en el peor de los casos tendremos que llegar a que esta longitud sea menor que el error aceptado, y en este caso el número de iteraciones será log(2)-1·log((b0-a0)/error)

si a=104 y error=10-3 entonces log(2)-1·log((b0-a0)/error)=23,2533... y como máximo en 24 iteraciones llegaremos al valor que buscamos, lo que es una mejora considerable con respecto al algoritmo inicial.

Si el error utilizado es muy pequeño puede darse el caso de que la longitud del intervalo no pueda reducirse debido a que la distancia del punto medio con respecto a cualquiera de los extremos sea menor que el incremento mínimo que ofrece un número de coma flotante. También tendrás que detectar este caso, es decir, tendrás que comprobar que el nuevo punto medio sea distinto del de la iteración anterior, y si fuesen iguales este será la mejor aproximación que puedas obtener con el error que hayas elegido.

Otra cosa más. La derivada f'(x) = -2x toma valores positivos para valores negativos de x y valores negativos para valores positivos de x, pero teniendo en cuenta que la raíz cuadrada de un número negativo no es un número real, descartamos directamente los valores negativos de a, luego los valores de la variable x serán siempre positivos y así f siempre será decreciente en los intervalos considerados, por lo que la raíz será única y no llegaremos a bucles infinitos salvo en el caso descrito en el párrafo anterior.

¡Saludos!
« Última modificación: 26 Julio 2015, 10:30 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
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,032 Último mensaje 4 Noviembre 2007, 19:13 pm
por zered
Calcular la raíz cuadrada
Scripting
Meta 5 10,588 Último mensaje 30 Septiembre 2010, 18:16 pm
por Meta
[Ayuda novato] Raiz cuadrada en C sin sqrt « 1 2 »
Programación C/C++
bourne1191 18 43,773 Último mensaje 6 Diciembre 2013, 20:51 pm
por amchacon
Sacar raiz cuadrada sin usar la funcion sqrt(x)
Programación C/C++
mort 3 3,846 Último mensaje 10 Febrero 2015, 23:35 pm
por mort
Cálcular Raiz Cuadrada de un número en Visual Basic 2010
.NET (C#, VB.NET, ASP)
vAilleght 3 28,415 Último mensaje 24 Noviembre 2016, 20:25 pm
por vAilleght
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines