Los tipos de punto flotante (como Single y Double) se representan en la memoria mediante un signo, una mantisa y un exponente. Piense en ello como notación científica:
Sign*Mantissa*Base^Exponent
Ellos, como es de esperar, usan la base 2. Hay otros ajustes que permiten representar el infinito y NaN, y el exponente está compensado (volverá a eso), y una abreviatura de la mantisa (volverá a eso también) . Busque el estándar IEEE 754 que cubre su representación y operaciones para obtener más detalles.
Para nuestros propósitos, podemos imaginarlo como un número binario "mantissa" y un "exponente" que le dice dónde colocar el separador decimal.
En el caso de Single, tenemos 1 bit para el signo, 8 para el exponente y 23 para la mantisa.
Ahora, la cosa es que almacenaremos la mantisa desde el dígito más significativo. Recuerde que todos los ceros a la izquierda no son relevantes. Y dado que estamos trabajando en binario, sabemos que el dígito más significativo es un 1 ※. Bueno, como sabemos eso, no tenemos que almacenarlo. Gracias a esa taquigrafía, el rango efectivo de la mantisa es de 24 bits.
※: A menos que el número que estamos almacenando sea cero. Para eso tendremos todos los bits puestos a cero. Sin embargo, si intentamos interpretar eso bajo la descripción que di, tendrías un 2 ^ 24 (el implícito 1) multiplicado por 1 (2 a la potencia del exponente 0). Entonces, para arreglarlo, el exponente cero es un valor especial. También hay valores especiales para almacenar infinito y NaN en el exponente.
Según el desplazamiento del exponente, además de evitar los valores especiales, tenerlo desplazado permite colocar el punto decimal antes del comienzo de la mantisa o después de su final, sin la necesidad de tener un signo para el exponente.
Esto significa que para números grandes, el tipo de coma flotante colocará el punto decimal más allá del final de la mantisa.
Recuerde que la mantisa es un número de 24 bits. Nunca representará un número de 25 bits ... no tiene ese bit extra. Por lo tanto, el single no puede distinguir entre 2 ^ 24 y 2 ^ 24 + 1 (estos son los primeros números de 25 bits, y difieren en el último bit, que no está representado en el single).
Por lo tanto, para enteros, el rango del single es -2 ^ 24 a 2 ^ 24. E intentar agregar 1 a 2 ^ 24 dará como resultado 2 ^ 24 (porque en lo que respecta al tipo, 2 ^ 24 y 2 ^ 24 + 1 son el mismo valor). Pruébalo en línea . Es por eso que hay una pérdida de información al convertir de entero a único. Y esta es también la razón por la cual un bucle que usa un simple o doble podría ser un bucle infinito sin que lo notes.