Estoy aprendiendo a programar y me encontré con el subproducto interesante de la representación de números de computadora que se muestra por
Al tratar de entender por qué ocurre esto, uno tiene que entender cómo se almacena 0.1 en la computadora. me di cuenta de que
Curioso sobre cómo determinar realmente estos números, intenté escribir un script de Python para encontrarlos y fracasé miserablemente. Luego recurrí a Google y encontré esta respuesta a una pregunta similar: https://math.stackexchange.com/a/2119191/22276 . Pude seguir la solución por completo en mi caso hasta la parte que calculó los números 14411518807585587 y 14411518807585588. ¿Cómo uso estos números para obtener los dos números circundantes?
Como referencia, mis dos enteros estarían determinados por:
Aquí es donde estoy atascado.
Dejar . Dejar los valores correspondientes redondeados a números de doble precisión. Tienes
x' = 0.0001100110011001100110011001100110011001100110011001101 (bin)
x' = 0.1000000000000000055511151231257827021181583404541015625 (dec)
y' = 0.0011001100110011001100110011001100110011001100110011010 (bin)
y' = 0.2000000000000000111022302462515654042363166809082031250 (dec)
z' = 0.0100110011001100110011001100110011001100110011001100110 (bin)
z' = 0.2999999999999999888977697537484345957636833190917968750 (dec)
Ahora agrega y obtener como sumas brutas
x'+y' = 0.0100110011001100110011001100110011001100110011001100111 (bin)
x'+y' = 0.3000000000000000166533453693773481063544750213623046875 (dec)
que se redondearía a
(x'+y')'= 0.010011001100110011001100110011001100110011001100110100 (bin)
(x'+y')'= 0.3000000000000000444089209850062616169452667236328125 (dec)
Eso no y es decir se redondean, mientras que es decir se redondea hacia abajo y está redondeado.
Intenté escribir un script de python para encontrarlos y fracasé miserablemente.
En realidad, es bastante trivial mostrar un número de coma flotante exactamente en python (lo probé con 3.5). Convertir un número de coma flotante en una cadena da como resultado directamente una respuesta de "ajuste más corto", pero convertirlo a través de un "Decimal" da la respuesta exacta.
from decimal import Decimal, getcontext
print(Decimal(0.1)) # 0.1000000000000000055511151231257827021181583404541015625
print(Decimal(0.2)) # 0.200000000000000011102230246251565404236316680908203125
Ahora intentemos sumarlos, tanto exactamente como usando aritmética de coma flotante.
getcontext().prec = 55 # needed to avoid rounding when we add two Decimal's together.
print(Decimal(0.1)+Decimal(0.2)) # 0.3000000000000000166533453693773481063544750213623046875
print(Decimal(0.1+0.2)) # 0.3000000000000000444089209850062616169452667236328125
Vemos que la aritmética de punto flotante ha dado como resultado cierto redondeo.
Finalmente, veamos qué valor obtenemos para la constante 0.3
print(Decimal(0.3)) # 0.299999999999999988897769753748434595763683319091796875
amante de las matemáticas
Arte simplemente hermoso
flotador