El siguiente código python calcula el número de iteraciones para hacer cosas basadas en algunas variables.Aritmética de punto flotante: ¿posible dependencia insegura en comparación específica?
# a - b - c is always a multiple of d.
i = (a - b - c)/d
while i:
# do stuff
i -= 1
Las variables serán todos del mismo tipo, es decir solamente ints
o floats
o lo que sea. Mi preocupación es si funcionará correctamente si los valores son floats
. Sé lo suficiente como para considerar siempre las trampas de confiar en los valores exactos de flotación. Pero no puedo decir si lo anterior es peligroso o no. Puedo usar i = int(round((a - b - c)/d))
, pero tengo curiosidad por comprender mejor a los flotadores.
Todo se reduce a lo siguiente: a - b - c
es un múltiplo exacto de d
. Así que estoy confiando en (a-b-c)/d
para convertirme en un valor i
del que puedo restar 1
y obtener el número esperado de iteraciones en el ciclo while, con la suposición implícita de que i == 0
se convierte en verdadero. Es decir, ¿se pueden disminuir los múltiplos calculados como este en 1 para llegar exactamente a 0?
Me gustaría saber no solo si no es seguro, pero lo más importante, ¿qué debo entender sobre el punto flotante para resolver una pregunta como esta? Si alguien sabe con decisión si esto es seguro o no, ¿sería posible explicar cómo?
Si crees que 'i' debe tener un valor entero, ejecútalo en un entero. ¡Eso al menos garantizará que tu bucle terminará! – katrielalex