Punto fijo vs número de punto flotante

109

Simplemente no puedo entender los números de punto fijo y flotante debido a definiciones difíciles de leer sobre ellos en todo Google. Pero ninguno de los que he leído proporciona una explicación lo suficientemente simple de lo que realmente son. ¿Puedo obtener una definición simple con un ejemplo?

usuario942451
fuente
También me cuesta encontrar una buena definición. Lo principal que estoy buscando es algo que me ayude a comprender estos resultados: 3.11 + 42.0 = 45.110001 (no 45.11), 3.12 + 42.0 = 45.119999 (no 45.12), 3.15 + 42.0 = 45.150002 (no 45.15).
Bart S.
1
Creo que esta es una discusión relevante (especialmente describiendo las trampas con números flotantes y la mejor precisión con punto fijo y por qué nunca querrías describir el dinero como flotante. Stackoverflow.com/questions/6320209/…
Andrew Norman
Enlace aleatorio donde se mencionan los temas "OpenGL® ES OpenGL ES incluye perfiles para sistemas de punto flotante y punto fijo y la especificación EGL ™ ..."
The Red Pea

Respuestas:

145

Un número de coma fija tiene un número específico de bits (o dígitos) reservados para la parte entera (la parte a la izquierda del punto decimal) y un número específico de bits reservados para la parte fraccionaria (la parte a la derecha del decimal punto). No importa cuán grande o pequeño sea su número, siempre usará el mismo número de bits para cada porción. Por ejemplo, si su formato de punto fijo estuviera en decimal, IIIII.FFFFFentonces el número más grande que podría representar sería 99999.99999y el número más pequeño distinto de cero sería 00000.00001. Cada fragmento de código que procesa tales números debe tener un conocimiento integrado de dónde está el punto decimal.

Un número de coma flotante no reserva un número específico de bits para la parte entera o fraccionaria. En su lugar, reserva un cierto número de bits para el número (llamado mantisa o significando ) y un cierto número de bits para decir dónde se encuentra dentro de ese número el lugar decimal (llamado exponente ). Por lo tanto, un número de punto flotante que ocupe 10 dígitos con 2 dígitos reservados para el exponente podría representar un valor más grande de 9.9999999e+50y un valor distinto de cero más pequeño de 0.0000001e-49.

Gabe
fuente
8
Bueno, estás olvidando que los números de punto flotante casi siempre están firmados, por lo que el valor mínimo sería realmente -9.9999999e+50.
Brian Gordon
4
También hay un sesgo de exponente para que pueda representar valores mucho más discretos entre 0 y 1 que entre 1,000,000 y 1,000,001. Y surgen muchas complicaciones con las operaciones de punto flotante, como asegurarse de no informar 0 como la diferencia entre dos números muy similares cuando el sesgo no es suficiente para aumentar la precisión.
Brian Gordon
28
@BrianGordon: No me olvidé de los bits de signos; Los ignoré intencionalmente para tener una descripción simple y no tener que preocuparme por la diferencia entre mínimo / máximo y más pequeño / más grande. También omití intencionalmente el sesgo de exponentes (que no tiene nada que ver con el número de valores discretos entre dos números), NaN, infinitos, normalización, subdesbordamiento gradual, ceros con signo, el hecho de que la mayoría de los flotantes son binarios (lo que permite que el primer bit de la mantisa), y una serie de otros aspectos que son innecesarios para ilustrar el concepto.
Gabe
2
¿Por qué es el límite para el número mínimo de puntos fijos 00000.00001? Espero ver en su 00000.00000lugar. Además, ¿tiene alguna referencia que entre en más detalles sobre los números de coma fija?
Nicholas Miller
4
@NickMiller: Perdón por la confusión, pero estaba hablando de números distintos de cero. Mi formato de ejemplo puede representar 0, 0.00001, 0.00002, ..., 99999.99998, 99999.99999.
Gabe
31

Un número de punto fijo solo significa que hay un número fijo de dígitos después del punto decimal. Un número de coma flotante permite un número variable de dígitos después del punto decimal.

Por ejemplo, si tiene una forma de almacenar números que requiere exactamente cuatro dígitos después del punto decimal, entonces es un punto fijo. Sin esa restricción es punto flotante.

A menudo, cuando se usa un punto fijo, el programador realmente usa un número entero y luego asume que algunos de los dígitos están más allá del punto decimal. Por ejemplo, es posible que desee mantener dos dígitos de precisión, por lo que un valor de 100 significa en realidad 1,00, 101 significa 1,01, 12345 significa 123,45, etc.

Los números de coma flotante tienen un propósito más general porque pueden representar números muy pequeños o muy grandes de la misma manera, pero existe una pequeña penalización por tener que tener almacenamiento adicional para el lugar donde va el decimal.

Vaughn Cato
fuente
2
El uso de punto flotante se convierte en un problema cuando comienzas a hacer cálculos con ellos como, por ejemplo, si agregas un número de punto flotante muy pequeño y uno muy grande juntos. El resultado sumado pierde precisión porque tiene que representar un número con dos extremos y los decimales más bajos se recortan (y no se redondean).
Andrew Norman
2
también el uso potencial de valores de exponentes en un punto flotante puede causar problemas con los sistemas informáticos que esperan números estándar
Andrew Norman
5

Según tengo entendido, la aritmética de punto fijo se realiza utilizando números enteros. donde la parte decimal se almacena en una cantidad fija de bits, o el número se multiplica por cuántos dígitos de precisión decimal se necesitan.

Por ejemplo, si el número 12.34 debe almacenarse y solo necesitamos dos dígitos de precisión después del punto decimal, el número se multiplica por 100para obtener 1234. Al realizar matemáticas en este número, usaríamos este conjunto de reglas. Agregar 5620o 56.20a este número produciría 6854en datos o 68.54.

Si queremos calcular la parte decimal de un número de coma fija, usamos el operando módulo (%).

12.34 (pseudocódigo):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Los números de coma flotante son una historia completamente diferente en la programación. El estándar actual para números de coma flotante usa algo así como 23 bits para los datos del número, 8 bits para el exponente y 1 pero para el signo. Consulte este enlace de Wikipedia para obtener más información al respecto.

Sr. Goober
fuente
3

El término "punto fijo" se refiere a la forma correspondiente en que se representan los números, con un número fijo de dígitos después, y a veces antes, del punto decimal. Con la representación de punto flotante, la ubicación del punto decimal puede "flotar" en relación con los dígitos significativos del número. Por ejemplo, una representación de coma fija con una convención de colocación de coma decimal uniforme puede representar los números 123.45, 1234.56, 12345.67, etc., mientras que una representación de coma flotante podría representar además 1.234567, 123456.7, 0.00001234567, 1234567000000000, etc.

usuario3553000
fuente
-6

Tome el número 123.456789

  • Como entero, este número sería 123
  • Como punto fijo (2), este número sería 123,46 (asumiendo que lo redondeaste)
  • Como punto flotante, este número sería 123,456789

El punto flotante le permite representar la mayoría de los números con gran precisión. Fixed es menos preciso, pero más sencillo para la computadora.

Sparky
fuente
11
La precisión con la que puede escribir un número no está relacionada con si está escrito en punto flotante, entero o punto fijo. Está relacionado con la cantidad de dígitos significativos que tiene disponibles. Por ejemplo, INT_MAX es un número que se puede representar exactamente como un int, pero no como un flotante porque no tienen los 31 bits de precisión necesarios para representarlo exactamente.
Kian
1
fijo es el más preciso siempre que su tamaño para manejar el número en cuestión. Cuando hace matemáticas con números de punto fijo, el redondeo ocurre cuando un cálculo tiene un resto que excede el límite decimal. Con un punto flotante puede obtener un valor muy inexacto si agrega un número muy pequeño con uno muy grande. Cuando eso ocurre, los dígitos se pierden sin redondeo
Andrew Norman
Esto es engañoso y erróneo. Punto fijo significa que el número de dígitos después del punto decimal es fijo. No dice nada sobre cuánta precisión tiene.
Oscar Smith