Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DickGumshoe en 30 Octubre 2011, 12:09 pm



Título: Problema al elevar a 1/2
Publicado por: DickGumshoe en 30 Octubre 2011, 12:09 pm
Hola.

Estoy haciendo un programa en C++ en el que introduces la longitud de dos catetos y te calcula la hipotenusa. Lo tengo terminado, lo único que, como todos sabemos 1/2 es 0.5. Pues bien, si pongo lo siguiente:

Código:
// Dada la longitud de dos catetos calcular la hipotenusa

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main (void){
     float c1,c2,h;
     
      printf("Introduzca el valor de un cateto");
      scanf("%f",&c1);
     
     
      printf("Introduzca el valor del otro cateto");
      scanf("%f",&c2);
     
      h= pow (c1*c1+c2*c2,1/2);
     
      printf("El valor de la hipotenusa es %f",h);
     
    system("pause");
}

Ahí me calcula mal la hipotenusa. Sin embargo, si en la fórmula lo elevo a 0.5; sí me la calcula bien, cuando 1/2=0.5

Código:
// Dada la longitud de dos catetos calcular la hipotenusa

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main (void){
     float c1,c2,h;
     
      printf("Introduzca el valor de un cateto");
      scanf("%f",&c1);
     
     
      printf("Introduzca el valor del otro cateto");
      scanf("%f",&c2);
     
      h= pow (c1*c1+c2*c2,0.5);
     
      printf("El valor de la hipotenusa es %f",h);
     
    system("pause");
}

Muchas gracias.


Título: Re: Problema al elevar a 1/2
Publicado por: pucheto en 30 Octubre 2011, 14:24 pm
Tal vez haga division entera, entonces 1 / 2 no da 0.5 (en division entera da 0).
La otra posibilidad es que te calcule la division, de 0.5, y pase a entero, pudiendo dar 0 como 1, depende de como este configurado todo.


Título: Re: Problema al elevar a 1/2
Publicado por: DickGumshoe en 30 Octubre 2011, 14:32 pm
Tal vez haga division entera, entonces 1 / 2 no da 0.5 (en division entera da 0).
La otra posibilidad es que te calcule la division, de 0.5, y pase a entero, pudiendo dar 0 como 1, depende de como este configurado todo.

Cierto, he puesto el ejemplo de poner que ambos catetos son 2, y me ha dado 1, cosa que si lo elevamos a 0, da 1.

Entonces, ¿qué podría hacer para que al elevarlo a 1/2 de lo que debe dar? Aunque al elevarlo a 0.5 ya me de bien el resultado de la hipotenusa, solo es por curiosidad...

Muchas gracias ^^


Título: Re: Problema al elevar a 1/2
Publicado por: [L]ord [R]NA en 30 Octubre 2011, 14:39 pm
Existe sqrt() en math.h para hacer raices cuadradas.


Título: Re: Problema al elevar a 1/2
Publicado por: тαптяα en 30 Octubre 2011, 14:49 pm
Existe sqrt() en math.h para hacer raices cuadradas.
Es lo mismo. De hecho, creo que es más rápido pow(), aunque no puedo ponerte donde lei eso.

Cierto, he puesto el ejemplo de poner que ambos catetos son 2, y me ha dado 1, cosa que si lo elevamos a 0, da 1.

Entonces, ¿qué podría hacer para que al elevarlo a 1/2 de lo que debe dar? Aunque al elevarlo a 0.5 ya me de bien el resultado de la hipotenusa, solo es por curiosidad...

Muchas gracias ^^
Intenta a hacer esa misma division, justo una línea de ejecución antes, y haciendo la operación con float..


Título: Re: Problema al elevar a 1/2
Publicado por: DickGumshoe en 30 Octubre 2011, 14:54 pm
Es lo mismo. De hecho, creo que es más rápido pow(), aunque no puedo ponerte donde lei eso.
Intenta a hacer esa misma division, justo una línea de ejecución antes, y haciendo la operación con float..

Muchas gracias a todos.

¿Qué tendría que poner para hacer eso? Estoy iniciándome en C++, y no tengo muchos conocimientos...


Título: Re: Problema al elevar a 1/2
Publicado por: naderST en 30 Octubre 2011, 15:15 pm
En vez de usar 1/2 usa 0.5 y ya o (float)1/2

EDIT: Tu código es puro C no tiene nada de C++


Título: Re: Problema al elevar a 1/2
Publicado por: DickGumshoe en 30 Octubre 2011, 15:19 pm
En vez de usar 1/2 usa 0.5 y ya o (float)1/2

Ah, muchísimas gracias; ya me sale bien el resultado poniendo (float)1/2 ^^

Bueno, problema resuelto. Gracias a todos.


Título: Re: Problema al elevar a 1/2
Publicado por: do-while en 31 Octubre 2011, 14:37 pm
¡Buenas!

Cuando el operador / ve que sus dos valores son enteros, realiza la operacion entre enteros (te devolvera el cociente de la division euclidea), si quieres que realice la division entre float, alguno de sus operandos debe ser de ese tipo, lo que consigues mediante cast, o si el numero es una constante, añadiendo un punto justo despues del numero.

Las siguientes operaciones son equivalentes:
Código:

1 / 2 = 0 ( 1 = 2 * 0 + 1, por eso el resultado es cero)

((float) 1) / 2 = 0.5

1 / ((float)2) = 0.5;

1. / 2 = 0.5

1 / 2. = 0.5

1. / 2. = 0.5

Lo mismo sucede en el resto de operaciones y expresiones, los valores se convierten al tipo de dato capaz de almacenar cualquiera de los valores que aparecen en la expresion. Asi, al haber un valor float en las anteriores operaciones, el otro se convierte automaticamente a float para poder realizar la division.

Si en una expresion mezclas int, char y float, al final, el resultado sera un float, y en algun momento, los valores que forman parte de la expresion seran convertidos a float para realizar las operaciones. Lo mismo sucedera si mezclas char e int, el resultado sera un int, y en algun momento dejara de haber elementos char en al expresion, porque seran convertidos a int.

Puedes buscar informacion sobre la promocion (creo que se llamaba asi) entre los distintos tipos de dato. Si estas informado te encontraras con menos sorpresas inesperadas.

¡Saludos!


Título: Re: Problema al elevar a 1/2
Publicado por: DickGumshoe en 31 Octubre 2011, 23:12 pm
Muchas gracias por la aclaración, do-while ^^