Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: bourne1191 en 6 Diciembre 2013, 11:55 am



Título: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: bourne1191 en 6 Diciembre 2013, 11:55 am
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!


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: ivancea96 en 6 Diciembre 2013, 12:24 pm
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


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: amchacon en 6 Diciembre 2013, 12:41 pm
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


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: bourne1191 en 6 Diciembre 2013, 12:46 pm
joder, que despiste... muchas gracias, a ver si voy corrigiendo estos errores tan tontos. un saludo!!


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: bourne1191 en 6 Diciembre 2013, 12:49 pm
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


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: amchacon en 6 Diciembre 2013, 13:02 pm
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ó.


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: leosansan en 6 Diciembre 2013, 13:48 pm
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  (http://foro.elhacker.net/buscador2-t390560.0.html;msg1853654#msg1853654)



Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: do-while en 6 Diciembre 2013, 17:11 pm
¡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!


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: bourne1191 en 6 Diciembre 2013, 18:21 pm
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....


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: CCCoder en 6 Diciembre 2013, 19:22 pm
Código:
#include <math.h>

Código:
pow(2.0,2.0); 


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: leosansan en 6 Diciembre 2013, 20:08 pm
Código:
#include <math.h>

Código:
pow(2.0,2.0); 

Lamentablemente no puede usar la librería math.h, razón por la que tampoco le valdría el método propuesto por do-while:

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

La idea de usar Taylor era una simple sugerencia.

Teniendo en cuenta que cursa primero de ingeniería no creo que tenga problema de usar el método de la bisección o bipartición, o de Newton, o de la secante, o de la Regula-Falsi, o iteración de punto fijo, o....

Vamos que por métodos iterativos que no impliquen el uso de la mencionada librería math.h no quede.

Saluditos! ....



Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: Shell Root en 6 Diciembre 2013, 20:21 pm
n ^ (1/2) = Raiz Cuadrada
n ^ (1/3) = Raiz Cubica
...
...
...

---

sqrt(8) = 2,82842712474619
8^(1/2) = 8^(0.5) = 2.82842712474619




Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: ivancea96 en 6 Diciembre 2013, 20:26 pm
n ^ (1/3) = Raiz Cubica *

Las otras raíces se usan menos, y no tienen nombre xd

n ^(1/4) = Raiz Hipercúbica? jaja


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: Shell Root en 6 Diciembre 2013, 20:30 pm
@ivancea96

n ^(1/4) = Raiz Cuarta
n ^(1/5) = Raiz Quinta
y así sucesivamente.


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: ivancea96 en 6 Diciembre 2013, 20:35 pm
Yo estaba siguiendo el vocabulario e.e

También vale raiz segunda y raiz tercera.


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: amchacon en 6 Diciembre 2013, 20:46 pm
n ^ (1/2) = Raiz Cuadrada
n ^ (1/3) = Raiz Cubica
...
...
...

---

sqrt(8) = 2,82842712474619
8^(1/2) = 8^(0.5) = 2.82842712474619
¿Y como haces 8 ^ 0.5? Porque ese operador no existe el lenguaje :silbar:


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: Shell Root en 6 Diciembre 2013, 20:48 pm
o.O!
La potenciación existe en cualquier lenguaje  :silbar:


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: ivancea96 en 6 Diciembre 2013, 20:49 pm
amchacon, puedo llamarte Dennis? :D


Título: Re: [Ayuda novato] Raiz cuadrada en C sin sqrt
Publicado por: amchacon en 6 Diciembre 2013, 20:51 pm
o.O!
La potenciación existe en cualquier lenguaje  :silbar:
Pues pruebalo, seguro que te compila :silbar:

Las operaciones que definen los lenguajes son las que puede hacer el procesador de forma nativa (suma, resta, multiplicación, división y modulo). El resto de operaciones matemáticas no se pueden realizar de forma nativa en la mayoría de los procesadores (domésticos por lo menos).

amchacon, puedo llamarte Dennis? :D
¿Quien es Dennis? xD

EDITO: Ah demonios, Dennie Ritchie. Lo dices por mi avatar xD