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.