Problema al elevar a 1/2

Iniciado por DickGumshoe, 30 Octubre 2011, 12:09 PM

0 Miembros y 1 Visitante están viendo este tema.

DickGumshoe

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:

// 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

// 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.

pucheto

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.

DickGumshoe

Cita de: 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.

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 ^^

[L]ord [R]NA

Existe sqrt() en math.h para hacer raices cuadradas.

тαптяα

Cita de: [L]ord [R]NA en 30 Octubre 2011, 14:39 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.

Cita de: DickGumshoe en 30 Octubre 2011, 14:32 PM
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..

DickGumshoe

Cita de: тαптяαпсє en 30 Octubre 2011, 14:49 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...

naderST

#6
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++

DickGumshoe

Cita de: naderST en 30 Octubre 2011, 15:15 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.

do-while

¡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:


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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

DickGumshoe

Muchas gracias por la aclaración, do-while ^^