Verifique la igualdad de la división de enteros y math.floor() de la división regular en Python

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^53lí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

Publicación traducida automáticamente

Artículo escrito por Stark17 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *