places number float decimals decimales change aproximar python python-2.7 floating-point numbers syntax-error

number - python float precision



Entrada de punto flotante binario/hexagonal (2)

Bueno, se llaman puntos decimales ;)

Podría usar una especie de notación científica *

>>> 0b10111011101 * 0b10**-4 93.8125 >>> 0x5dd * 0x10**-1 93.8125 >>> 938125 * 10**-4 # note power is number of "decimal" places to shift 93.8125

* sí me doy cuenta de que esto no es realmente notación científica

Editar

Por curiosidad, utilicé el módulo dis para desensamblar el código de bytes para una simple estas declaraciones para ver si se calcularon en tiempo de ejecución o no

>>> import dis >>> def f(): ... return 0x5dd * 0x10**-1 ... >>> dis.dis(f) 2 0 LOAD_CONST 6 (93.8125) 3 RETURN_VALUE

Por lo tanto, parece que no debería ver una penalización de rendimiento al usar este método.

Editar 2

... A menos que uses Python 2

>>> import dis >>> def f(): ... return 0x5dd * 0x10**-1 ... >>> dis.dis(f) 2 0 LOAD_CONST 1 (1501) 3 LOAD_CONST 4 (0.0625) 6 BINARY_MULTIPLY 7 RETURN_VALUE

¿Por qué los puntos decimales solo están permitidos en la base 10? ¿Por qué lo siguiente plantea un error de sintaxis?

0b1011101.1101

¿Hay alguna ambigüedad en el número que estoy escribiendo? Parece que no hay un número posible que la cadena pueda representar aparte de 93.8125

El mismo problema se aplica a otras bases también:

0x5d.d

Puedo programar mi camino alrededor de esto con una función bastante sencilla:

def base_float(number_string, base): n = number_string.split(''.'') number = int(n[0], base) if len(n) > 1 and len(n[1]): frac_part = float(int(n[1], base)) / base**len(n[1]) if number < 0: frac_part = -frac_part number += frac_part return number

Y me da la representación que esperaba:

>>> base_float(''0b1011101.1101'', 2) 93.8125

int acepta una base arbitraria, pero sin punto decimal, y float acepta un punto decimal pero no una base arbitraria. ¿Por qué?


Como las personas en los comentarios ya escribieron: simplemente no se consideró necesario.

Pueden ser muy útiles, especialmente cuando existe la necesidad de almacenar el valor exacto de una entidad dada y retenerla de nuevo, pero estos casos solo ocurren en raras ocasiones.

Su función es - si reemplazo if int_part < 0: con if number < 0: - muy útil.