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


 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda novato] Raiz cuadrada en C sin sqrt
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda novato] Raiz cuadrada en C sin sqrt  (Leído 31,557 veces)
bourne1191

Desconectado Desconectado

Mensajes: 4


Ver Perfil
[Ayuda novato] Raiz cuadrada en C sin sqrt
« en: 6 Diciembre 2013, 11:55 »

Hola! soy nuevo por aqui. Estoy estudiando ingeniería, y en una asignatura de informática han mandado hacer un programa para calcular la raíz cuadrada de un número real N sin usar la funcion sqrt sin la libreria math. Entonces, pensé en hacer una iteracíon desde i=0.1 a i=X hasta que i*i=>N... pero no me salen las cosas como quiero. os pongo el código;

Código:
#include<stdio.h>

void main(void)
{
float n,res;
float i=0;
printf ("Introduzca variable n\n");
scanf ("%f",&n);

do
{
i= i+0.1;
res= i*i;
}while (res>=n);

printf ("\nLa raíz cuadrada de %f es %f",n,i);

getch();
}

sabéis ayudarme de alguna manera? gracias!


« Última modificación: 6 Diciembre 2013, 11:58 por bourne1191 » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.410


ASMático


Ver Perfil WWW
Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
« Respuesta #1 en: 6 Diciembre 2013, 12:24 »

Código
  1. #include<stdio.h>
  2.  
  3. void main(void)
  4. {
  5. float n,res;
  6. float i=0;
  7. printf ("Introduzca variable n\n");
  8. scanf ("%f",&n);
  9.  
  10. do
  11. {
  12. i= i+0.1;
  13. res= i*i;
  14. }while (n>=res);
  15.  
  16. printf ("\nLa raíz cuadrada de %f es %f",n,i);
  17.  
  18. }

Pusiste "}while (res>=n);" en vez de "}while (n>=res);".

Está bien el algoritmo. Podrías pensar en darle más precisión, como haciendo que vaya de 0.01 en 0.01.
Pero bueno, solo es eso.

Suerte


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
« Respuesta #2 en: 6 Diciembre 2013, 12:41 »

Está bien el algoritmo. Podrías pensar en darle más precisión, como haciendo que vaya de 0.01 en 0.01.
Pero bueno, solo es eso.

Suerte

Con todo el respeto del mundo, ese algoritmo es una auténtica caca. Primero porque es muy lento (ponle la raíz de 500 a ver que tal), segundo porque es muy poco preciso.

Lo que te están pidiendo esque hagas las series de taylor, la raíz de x puede expresarse como el limite de la siguiente sucesión:

Citar
a(0) = 0
a(1) = (1+x) / 2
a(n) = (a(n-1)+x/a(n-1))/2

Siendo x el número del que quieres obtener la raíz. El error con el que estás calculando la raíz puede expresarse como:

Citar
a(n)-a(n-1)

De modo que si quieres calcular de raíz de un numero con una precisión de 1e-15 (15 decimales de precisión). Tendrías que empezar en a(1) y ir aplicando la sucesión a(n). En cada calculo haces la resta con el valor anterior y paras cuando el error sea menor a 1e-15.

Ese es algoritmo que usa sqrt, debería darte el mismo resultado (puede variar en los decimales 16-17, pero es un error despreciable).

Pregunta si tienes alguna duda.

PD: No lo he dicho, pero para tener 15 decimales de precisión necesitaras usar double y no float
« Última modificación: 6 Diciembre 2013, 12:44 por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
bourne1191

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
« Respuesta #3 en: 6 Diciembre 2013, 12:46 »

joder, que despiste... muchas gracias, a ver si voy corrigiendo estos errores tan tontos. un saludo!!
En línea

bourne1191

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
« Respuesta #4 en: 6 Diciembre 2013, 12:49 »

Con todo el respeto del mundo, ese algoritmo es una auténtica caca. Primero porque es muy lento (ponle la raíz de 500 a ver que tal), segundo porque es muy poco preciso.

Lo que te están pidiendo esque hagas las series de taylor, la raíz de x puede expresarse como el limite de la siguiente sucesión:

Siendo x el número del que quieres obtener la raíz. El error con el que estás calculando la raíz puede expresarse como:

De modo que si quieres calcular de raíz de un numero con una precisión de 1e-15 (15 decimales de precisión). Tendrías que empezar en a(1) y ir aplicando la sucesión a(n). En cada calculo haces la resta con el valor anterior y paras cuando el error sea menor a 1e-15.

Ese es algoritmo que usa sqrt, debería darte el mismo resultado (puede variar en los decimales 16-17, pero es un error despreciable).

Pregunta si tienes alguna duda.

PD: No lo he dicho, pero para tener 15 decimales de precisión necesitaras usar double y no float

buena respuesta.. por ahora estoy empezando con C y no sé como meter ese tipo de límites en el compilador, pero suena bastante interesante y me pondré a investigarlo. desde luego, mi algoritmo era un poco "de andar por casa"... saludos y gracias
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
« Respuesta #5 en: 6 Diciembre 2013, 13:02 »

buena respuesta.. por ahora estoy empezando con C y no sé como meter ese tipo de límites en el compilador, pero suena bastante interesante y me pondré a investigarlo. desde luego, mi algoritmo era un poco "de andar por casa"... saludos y gracias
Dudo que te pidan lo que has hecho en el primer post, lo más probable esque te pidan que hagas la raíz así. Es un problema típico de primero, probablemente también te pidan que calcules e^x y el seno también.

Si es un problema de primero, es porque no es tan complicado como parece. Lo que pasa esque como aparecen matemáticas asusta un poco. Planteatelo así, la serie se hace con un bucle y tres variables (una es el valor actual, que deberá valer:

Código
  1. double valor = (1+x)/2; // o en vez de x lo llamas n como en tú código

La otra es con el valor anterior, lo dejaremos a cero por el momento. La otra tendrá el error, que tendrá lo mismo que la variable valor.

Ahora tenemos que hacer un bucle, lo repetiremos mientras que (error > 1e-15). Recuerda que hemos dicho que vamos a dejar 15 decimales de precisión, si queremos menos se lo podemos cambiar, también puedes meterlo a mano si te resulta confuso lo de 1e-15:

Código
  1. while(error > 0.00000000000001

Ahora dentro del bucle, asignaremos a valor siguiendo la fórmula:

Código
  1. valor = (anterior+x/(anterior))/2;

Calcularemos el error:

Código
  1. error = valor-anterior;

Y actualizamos el anterior:

Código
  1. anterior = valor;

Y ya esta, prácticamente te he dicho todo. Tienes que unir todas las ideas que te he dicho. Después muestras valor por pantalla y san se acabó.
« Última modificación: 6 Diciembre 2013, 13:04 por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
« Respuesta #6 en: 6 Diciembre 2013, 13:48 »

Hola! soy nuevo por aqui. Estoy estudiando ingeniería, y en una asignatura de informática han mandado hacer un programa para calcular la raíz cuadrada de un número real N sin usar la funcion sqrt sin la libreria math.................

Mira si te sirve de orientación:

raiz sin sqrt

« Última modificación: 6 Diciembre 2013, 18:27 por leosansan » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
« Respuesta #7 en: 6 Diciembre 2013, 17:11 »

¡Buenas!

Mas sencillo que Taylor(Quien ha hablado de Taylor???  :silbar:). Con Bolzano puedes hacerlo perfectamente (o por el teorema de los valores intermedios). Ademas Bolzano lo has tenido que estudiar en bachiller y sabes como funciona. x es raiz cuadrada de c si y solo si c - x2 = 0

En principio solo tienes que calcular la raiz cuadrada positiva, por lo que una cota inferior de la raiz cuadrada siempre sera cero. Y como cota superior tienes dos opciones. Si c > 1, tomas como cota superior c, y si c<1 la cota superior escogida tiene que ser 1. Ten en cuenta que tienes dos casos particulares, que coinciden con los valores 0 y 1 que estas utilizando como cotas especificas, en los que sabes exactamente cual es el valor de la raiz.

Una vez comprobado que el valor del que quieres obtener la raiz cuadrada no es ni cero ni uno, empiezas a iterar:
- Calculas el punto medio del intervalo [cota_inferior,cota_superior]
- Si punto_medio al cuadrado > valor -> cota_superior = punto_medio
- Si punto_medio al cuadrado < valor -> cota_inferior = punto_medio
- Si punto medio al cuadrado = valor -> raiz_cuadrada = punto_medio
- Repetir mientras absoluto(valor - punto_medio al cuadrado) > error_que_yo_quiera.

En ocasiones puedes llegar a un punto que no sea la raiz pero que no cambie, asi que tambien deberias controlar que el punto medio de una iteracion no sea el mismo que el de la anterior. Si sucede esto ultimo, el valor que obtengas sera la mejor aproximacion que puedas conseguir.

¡Saludos!

Y si no quieres recurrir a metodos iterativos puedes usar el siguiente razonamiento:

x2 = c -> 2 Ln(x) = Ln(c) -> Ln(x) = Ln(c) / 2 -> x = eLn(c)/2

O equivalentemente x = blogb(c)/2

¡Saludos!
« Última modificación: 6 Diciembre 2013, 17:35 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!
bourne1191

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
« Respuesta #8 en: 6 Diciembre 2013, 18:21 »

bueno escribo este post sin haberme leido las respuestas en profundidad, antes que nada agradeceros el esfuerzo, voy a mirarme seriamente e ir planteando todo, a ver que tal se da la cosa....
En línea

CCCoder

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
« Respuesta #9 en: 6 Diciembre 2013, 19:22 »

Código:
#include <math.h>

Código:
pow(2.0,2.0);
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Raiz cuadrada en c « 1 2 »
Programación C/C++
JOSE23 11 23,482 Último mensaje 21 Febrero 2011, 18:06
por JOSE23
Uso de raiz cuadrada en C#
.NET (C#, VB.NET, ASP)
Riudo 6 19,673 Último mensaje 28 Febrero 2011, 20:22
por [D4N93R]
RAIZ Cuadrada en 82C52
ASM
CATBro 1 3,354 Último mensaje 8 Junio 2011, 12:02
por ShotgunLogic
Sacar raiz cuadrada sin usar la funcion sqrt(x)
Programación C/C++
mort 3 2,075 Último mensaje 10 Febrero 2015, 23:35
por mort
Duda calcular raiz cuadrada sin sqrt C++
Programación C/C++
seryioo 4 5,668 Último mensaje 26 Julio 2015, 10:10
por do-while
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines