¿Por qué las comparaciones entre valores flotantes muy grandes fallan en python?

En mi opinión, sys.float_info.max es el mayor valor flotante posible. Sin embargo, parece que la comparación de valores tan grandes falla .

 import math import sys m = sys.float_info.max # type 'float' m == m # True m  m # False m == m-1.0 # True m  m-1.0 # False m == m-1e100 # True m  m-1e100 # False m == m-1e300 # False m > m-1e300 # True m < m-1e300 # False 

Supongo que es por la precisión limitada? Si es así, ¿en qué rango numérico puedo operar de manera segura?

El código anterior se ejecutó con Python 3.5.2.

En una máquina típica que ejecuta Python, hay 53 bits de precisión disponibles para un flotador Python. Si intentas ir más lejos, Python eliminará la parte más pequeña para que el número se pueda representar correctamente.

Por lo tanto, el valor 1 se absorbe o cancela para poder representar el valor alto que está tratando de calcular.

El límite se obtiene restando (o sumndo) el valor multiplicado por float epsilon.

En mi máquina:

 maxfloat == 1.7976931348623157e+308 epsilon == 2.220446049250313e-16 

código de prueba de muestra

 import math import sys m = sys.float_info.max # type 'float' eps = sys.float_info.epsilon print(m == m-(m*(eps/10))) # True print(m == m-(m*eps)) # False 

m*eps es el valor más pequeño que tienes que restar para que la comparación falle. Siempre es relativo al valor m .

Tal vez si intenta imprimir esos números, entenderá mejor lo que son:

 >>> sys.float_info.max 1.7976931348623157e+308 >>> sys.float_info.max - 1.0 1.7976931348623157e+308 >>> sys.float_info.max - 1e100 1.7976931348623157e+308 >>> sys.float_info.max - 1e300 1.7976931248623157e+308 

Tenga en cuenta que la impresión no describe casi todos los problemas que se pueden encontrar con la precisión del número de punto flotante, pero en este caso, los “problemas” son triviales. Puedes ver que solo el último número es diferente.