Para cocientes grandes, floor division (//)
no parece ser necesariamente igual al piso de la división regular(math.floor(a/b))
Ejemplos:
Input : 269792703866060742 // 3 Output : 89930901288686914 Input : math.floor(269792703866060742 / 3) Output : 89930901288686912
En los ejemplos anteriores, la salida para floor division(//)
es 89930901288686914 y la salida para math.floor es 89930901288686912. Todos los dígitos son iguales entre sí excepto los dos últimos dígitos en este ejemplo, es decir, 14 y 12.
La razón por la que los cocientes en el ejemplo no son iguales es que, en el math.floor(a/b)
caso de que el resultado se calcule con aritmética de punto flotante (IEEE-754 de 64 bits) , lo que significa que hay una precisión máxima. El cociente obtenido es mayor que el 2^53
límite por encima del cual el punto flotante ya no es exacto hasta la unidad. Sin embargo, con floor division(//)
Python usa su rango de enteros ilimitado, por lo que el resultado es correcto.
Nota: Para argumentos int y long, la división verdadera (/) puede perder información; esto está en la naturaleza de la verdadera división (siempre que los racionales no estén en el lenguaje). Los algoritmos que conscientemente usan largos deberían considerar usar //, ya que la verdadera división (/) de largos no retiene más de 53 bits de precisión (en la mayoría de las plataformas).
En un sistema informático típico, un número de punto flotante binario de «doble precisión» (64 bits) tiene un coeficiente de 53 bits, un exponente de 11 bits y un bit de signo. Consulte IEEE 754 .
Ejemplo:
# Python program to demonstrate # equality of integer division and # math.floor import math # First case: Take x smaller # than 2 ^ 53 . x = 269 y = 3 if (x // y) == math.floor(x / y): print("Equal Output") else: print("Not Equal Output") # Second case: Take x larger # than 2 ^ 53. x = 269792703866060742 y = 3 if (x // y) == math.floor(x / y): print("Equal Output") else: print("Not Equal Output")
Producción:
Equal Output Not Equal Output