[C con Clase] Problema con numero double en C++

José Luis Torre joseluistorrehernandez en gmail.com
Lun Jun 17 09:34:43 CEST 2013


Hola Luis:

Una regla a tener en cuenta es:

"No realizar nunca comparaciones de igualdad para números con decimales"

Ten en cuenta que cuando se almacena un número con decimales, el ordenador
lo hace "como le hemos enseñado", en este caso lo hace siguiendo unas
reglas que almacenan la parte decimal, el signo y el exponente, pero tanto
la parte decimal como el exponente tienen límites. Además, no se almacena
en base 10, sino en base 2 y por ello lo que tú crees que se está
almacenando no es lo que realmente se almacena.

Por ejemplo el 4.8 se almacena como 4.7999999999999990e000

Por esto, en los programas, nunca debemos realizar comparaciones de
igualdad con números del tipo float y double.

Si quieres puedes realizar comparaciones aproximadas de forma que abs(x-y)
< epsilon

Saludos
José Luis




El 16 de junio de 2013 23:00, Luis Gutierrez Gomez
<gutierrezgl en hotmail.com>escribió:

> Buenas Tardes:
>
> Haciendo algunas practicas de programacion en C++, me topé con un problema
> que es el siguiente:
> En esta porcion del programa que hago
>
> double numero1, numero2, numero3, numero4;
> bool resp;
>
> numero1 = 9.8;
> numero2 = 4.8;
> numero3 = 10.5;
> numero4 = 5.5;
>
> resp = ((numero1 - numero2) == (numero3 - numero4)) ? 1 : 0;
>
> return (resp);
>
> ¿Porque me da como resultado resp = 0 , si como se ve, los resultados de
> las diferencias
> son 5 en ambos casos? Deberia dar 1.
> Estuve tratando de entenderlo, me parece que estaria relacionado con los
> digitos menos significativos del double que no aparecen, si es así, como
> podria hacer para evitar esta complicación?
>
> Intenté tambien hacerlo de esta manera, pero da lo mismo:
>
> doble booster1, booster2;
>
> booster1 = numero1 - numero2;
> booster2 = numero3 - numero4;
>
> resp = (booster1 == booster2) ? 1:0;
>
> return (resp);
>
> Muchas gracias
>
> Luis G.
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
José Luis Torre
ww.ehu.es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130617/09901f08/attachment.html>


Más información sobre la lista de distribución Cconclase