Siempre pensamos en una computadora como una máquina precisa y veloz. Normalmente los errores son provocados por el programador, pero quizá os sorprenda saber que nuestra computadora, funcionando perfectamente, también puede llevarnos a cometer errores. Un ejemplo de ello es cuando sumamos 100 veces la cifra 0.1 y el resultado no es 10 en el lenguaje de programación Python. Este no es un problema único de Python. De hecho, podéis comprobarlo en vuestra hoja de cálculo favorita: colocad 100 celdas con 0.1 y sumadlas...
Comentarios
Solución? No uses coma flotante a no ser que sea estrictamente necesario.
Anda que no me han dado dolores de cabeza las jodidas comparaciones de reales.
Venía a comentar lo mismo que #5. Hay que saber qué tipos de datos estás usando.
La noticia no es errónea, es imprecisa. Siempre que uses números flotantes tienes un error de precisión, está implícito en el concepto de flotante: No se puede tener cualquier número expresado en 32 bits, ni 64 bits. Sumar 100 veces 0.1 en flotante da algo como 9.99999999999998, lo que es casi 10.0, pero no 10.0. Eso es correcto y el artículo no miente. Todos los programadores sabemos que no podemos comparar directamente flotantes porque pueden ser casi iguales, pero no iguales.
Cuando queremos tener total precisión no tenemos que usar flotantes, si no números decimales de precisión arbitraria. Ocupan más, son mucho más lentos, pero son precisos. Hay librerías para usarlos y el GCC tiene una.
Un ejemplo de programa que usa decimales de precisión arbitraria es bc "An arbitrary precision calculator language".
Ejemplo:
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
10.0
#11 estupendo comentario. Muy útil.
En todo caso, discrepo con que la noticia sea imprecisa, mucho menos errónea.
El artículo habla justamente de este tema.
A mi si me suma 10 ----> ERRONEA
#2 , #3 y #4 Pero leed el post y haced lo de la configuración del formato... almas de cántaro...
#3 Eres tú el que está equivocado, ahí tienes seis decimales, ponle quince o más como manda el artículo que no te has leído.
#7 esto es menéame.
#17 Pues sí. Esto es menéame.
Y es una pena, porque hay cada vez más troll y más necio.
Lo de votar negativo o erróneo un post SIN LEERLO, creo que se podría catalogar con algún adjetivo peyorativo sin miedo a equivocarse.
Aún me queda la esperanza de que haya gente que, como tú, se tome la molestia de pensar antes de votar.
Gracias por el comentario.
en libreoffice lo de sumar 0.1 en 100 celdas da 10
#2 Ídem en Excel.
Pues es una pena que hayan tumbado la noticia por una gilipollez. Era bastante ilustrativa y es un concepto que muchas veces ni los mismo programadores conocen.
double num = 0.1;
double tot = 0;
for(int i = 0; i
#14 por eso mismo los bancos guardan los números en BDC (con decimal) y no en IEEE-754 .....
#0 Tranquilo, ya he rellenado esos huecos con masilla natural.
Lo mismo en mi PDA. Papel da puntar.
la próxima vez que asista a teoría del error y aprenda un poco.
javacri
var inc=0; for (var i = 0; i
💔 I HATE IEEE-754 Doble 💔
💗 I LOVE IEEE-754 Quad 💗
Me alegra ver que meneamé está lleno de súper dotados.
Hay un montón de gente que votó errónea en menos tiempo que se tarda en leer el post, o sea que deben ser tan listos que en un par de segundos han podido analizar la información y dar su sabio veredicto.
O son súper dotados, o son gilipollas, no lo tengo claro, aunque tengo mis sospechas.