Estoy usando un programa de gráficos en tiempo real que ofrece los siguientes "formatos de píxeles".
Entiendo muchos de ellos, pero una cosa que no entiendo es la diferencia entre float
y fixed
.
¿Por qué alguien usaría uno sobre el otro? Ambos ocupan la misma cantidad de espacio, por lo que no veo cómo uno podría ofrecer más precisión.
Básicamente, "flotante" significa que almacena una significando y un exponente base. Un flotante de 32 bits "estándar" utiliza 1 bit para el signo, 8 bits para el exponente y 23 bits para el signo y. La clave aquí es que la escala (el exponente) se almacena con el número.
"Fijo" se almacena en palabra alta/palabra baja "empaquetado". Un punto fijo de 32 bits probablemente será un entero de 16 bits antes de la raíz y un entero de 16 bits después (la parte decimal). Esto no concuerda con el comentario de @elegent sobre un rango entre 0 y 1: ese enlace puede ser específico de la implementación, no lo sé. Me parece que la implementación usa los 32 bits para la parte decimal y luego se basa en el contexto para la escala (el exponente) o que están aprovechando un modelo de color (probablemente) que usa el mismo rango.
Con respecto a la precisión: la cantidad de bits disponibles no equivale a una mejor precisión por sí sola, pero no estoy calificado para hablar sobre las distinciones más allá de los problemas obvios de desbordamiento/desbordamiento.
https://stackoverflow.com/questions/8638792/how-to-convert-packed-integer-16-16-fixed-point-to-float
https://stackoverflow.com/questions/7524838/fixed-point-vs-floating-point-number
En el contexto de su menú en pantalla: están utilizando fijo como sinónimo de entero: 8 bits fijos (rgba), significa 8 bits por píxel, donde cada byte representa un valor entero entre 0 y 255.
Simplifiquemos las cosas pensando en una imagen monocromática.
Para representar nuestra imagen, la cortamos en una cuadrícula de píxeles y registramos un número que representa la intensidad de la luz en cada píxel. Para simplificar, supongamos que el valor representa linealmente la cantidad de luz (la realidad es un poco más complicada que eso, pero está lo suficientemente cerca por ahora).
Sin embargo, todavía tenemos que representar ese número como un patrón de bits. Hay un número infinito de valores de intensidad de luz posibles, pero solo un número finito de patrones de bits posibles de un tamaño dado. Está claro que debemos hacer un compromiso.
Básicamente, existen dos estrategias para representar números en computadoras, punto fijo y punto flotante (los números enteros pueden considerarse un caso especial de punto fijo). También está la cuestión de los versos firmados sin firmar.
En un número de punto fijo fijamos el factor de escala de antemano. Entonces, por ejemplo, para representar números en el rango de 0 a 1 inclusive, podríamos usar un número sin signo de 32 bits con un factor de escala de 1/(2 32 -1).
En un número de coma flotante, permitimos elegir un rango de factores de escala. Hacemos esto dividiendo nuestros bits. Algunos bits se usan para almacenar un número binario y otros bits se usan para almacenar la potencia de 2 para escalar ese número binario (hay un poco de truco adicional en la práctica, lea IEEE 754 si realmente quiere los detalles sangrientos). Con los números de coma flotante podemos almacenar una gama muy amplia de números, pero la precisión varía según el valor del número.
Cuando se trata de una cámara, una pantalla o una impresora, nuestro hardware determina los valores más oscuros y más claros posibles y, por lo general, divide los valores posibles en el medio de manera aproximadamente igual. Los valores negativos realmente no tienen ningún sentido físico ya que no existe la luz negativa.
Por otro lado cuando nos adentramos en el mundo del modelado 3D puede ser útil para representar un rango mucho más amplio de valores de brillo. Puede haber una gran diferencia en el brillo entre las partes más brillantes y las más oscuras del mundo y aunque la luz negativa no existe físicamente, eso no significa que no pueda tenerla en un modelo 3D. Entonces, los formatos que usan números de punto flotante con signo pueden comenzar a tener sentido.
Por supuesto que hay un precio a pagar. El número de punto flotante con signo de 32 bits puede representar valores mucho más grandes y mucho más pequeños que el número de punto fijo sin signo de 32 bits, pero en algunos casos tendrá una precisión menor.
elegante