Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Ejercicios => Mensaje iniciado por: kevinlll6 en 22 Agosto 2014, 06:54 AM

Título: Una mano por favor , ejercicio de c
Publicado por: kevinlll6 en 22 Agosto 2014, 06:54 AM
Hola disculpen estoy empezando en c ,y a la hora de querer compilar este programa , tengo problemas en el área de multiplicación , por ejemplo 4.1*3 deberia dar igual a 12.3 , pero me arroja un resultado 12.29999 , ahora 3.4*1.1
3.74 , pero no lo reconoce , y así hay mas números que fallan , pero no todos , porque sucede esto?

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


using namespace std;
int main()//Accion Operacion Cuatro cositas
{
   float op1,op2,rpta,res2;
   char op;
   printf("Ingrese la operacion que desee realizar\n");
   printf("Ejemplo: 2 + 3\n \n");
   scanf("%f",&op1);
   scanf("%c",&op);
   scanf("%f",&op2);
   switch(op)
   {
   case '+':
      ;
       printf("\nOPERACION SUMA: \n \n");
       printf("%6.1f + %6.1f =",op1,op2);
       scanf("%f",&rpta);
       if(rpta==op1+op2)
       {
           printf("Felicitaciones!\n");
       }
       else
       {
           printf("Errooooor!\n");
       }
       break;
   case '-':

       printf("\nOPERACION RESTA: \n \n");
       printf("%6.1f - %6.1f =",op1,op2);
       scanf("%f",&rpta);
       if(rpta==op1-op2)
       {
           printf("Felicitaciones!\n");
       }
       else
       {
           printf("Errooooor!\n");
       }
       break;
   case '*':
       res2=op1*op2;
       printf("\nOPERACION MULTIPLICACION: \n \n");
       printf("%6.2f * %6.2f =",op1,op2);
       scanf("%f",&rpta);
       printf("%f \n" ,rpta);
      printf ("%f \n", res2);

       if(rpta==op1*op2)
       {
           printf("Felicitaciones!\n");
       }
       else
       {
           printf("Errooooor!\n");
       }
       break;
   case '/':
       if(op2!=0)
       {
           system("cls");
           printf("\nOPERACION DIVISION: \n \n");
           printf("%6.1f / %6.1f =",op1,op2);
           scanf("%f",&rpta);
           if(rpta==op1/op2)
           {
               printf("Felicitaciones!\n");
           }
           else
           {
               printf("Errooooor!\n");
           }
       }
       else
       {
           printf("\nOPERACION IMPOSIBLE,NO SE PUEDE DIVIDIR ENTRE 0\n");
       }
       break;
   default:
       printf("\nOPERADOR DESCONOCIDO\n");
   }
   system("pause");
   return 0;
}




Título: Re: Una mano por favor , ejercicio de c
Publicado por: Caster en 22 Agosto 2014, 12:06 PM
Antes de nada, esto va en el foro Programación C/C++ (http://foro.elhacker.net/programacion_cc-b49.0/).

Estás programando en C, así que esta línea sobra, eso es de C++.
Código (cpp) [Seleccionar]
using namespace std;

Y vamos al problema en sí: las operaciones fallan, creo, por la precisión de los decimales, y digo creo porque no tengo mucha idea sobre el tema. Para solucionarlo prueba a declarar las variables como double en vez de como float.

Otra cosa aparte, en la línea 18 debajo del "case'+':" hay un ";" que creo que tampoco pinta nada ahí.

Saludos.
Título: Re: Una mano por favor , ejercicio de c
Publicado por: eferion en 2 Septiembre 2014, 12:01 PM
Como te dijo Caster, el problema es de precisión.

Quizás, antes de realizar operaciones con decimales deberías aprender cómo se almacenan éstos números y que problemas pueden aparecer.

Los números en coma flotante permiten almacenar números bastante grandes / pequeños incluso con decimales... pero a cambio sacrifica precisión. Si quieres reducir esta pérdida de precisión puedes probar a usar double en vez de float.

printf("%6.1f + %6.1f =",op1,op2);

Tu ahí estás forzando a que en el número se imprima únicamente hasta el primer decimal... pero eso no quiere decir que el número real almacenado en op1 y op2 vayan a tener un número con un decimal... la conversión a coma flotante puede hacer que el número almacenado no sea exactamente el que esperas.

A modo de ejemplo: un float tiene una precisión de 6 dígitos, esto quiere decir que un número, por ejemplo el 1 puede acabar representado dentro del rango 0.999990 y 1.000009. O el número 12.3, este número puede acabar representado por un número cualquiera dentro del rango 12.29990 y 12.30009.

Lo dicho, si esta precisión te da problemas, cambia a double.