básicamente con el flotador que presentamos lo mejor de 32 bits que codifican
VALUE = SIGN * MANTISSA * 2^(128 - EXPONENT)
32-bits = 1-bit 23-bits 8-bits
y que se almacena como
MSB LSB
[SIGN][EXPONENT][MANTISSA]
ya que sólo recibe 23 bits, que es la cantidad de "precisión" se puede almacenar. Si está tratando de representar una fracción que es irracional (o repetitiva) en la base 2, la secuencia de bits se "redondeará" en el bit 23 °.
0.7 de base 10 es de 7/10, que en binario es 0b111/0b1010 que se obtiene:
0.1011001100110011001100110011001100110011001100110011... etc
Dado que este se repite, en precisión fija no hay manera de representar exactamente la misma. Lo mismo ocurre con 0.8, que en binario es:
0.1100110011001100110011001100110011001100110011001101... etc
para ver lo que el valor de precisión fija de estos números es que hay que "cortarles el paso" en el número de bits de usted y hace la matemáticas. El único truco es que el 1 principal está implícito y no almacenado, por lo que técnicamente obtienes un poco más de precisión. Debido al redondeo, el último bit será un 1 o un 0 dependiendo del valor del bit truncado.
Entonces el valor de 0.7 es efectivamente 11,744,051/2^24 (sin efecto de redondeo) = 0,699999988 y el valor de 0,8 es efectivamente 13,421,773/2^24 (redondeado hacia arriba) = 0,800000012.
Eso es todo lo que hay que hacer :)
Tenga en cuenta que 'a <0.7' primero convierte la versión de 32 bits de' a' a double (lo que da como resultado una representación imprecisa de 64 bits) y la compara con la versión de 0.7 bits menos precisa de 0.7. – Kos