Da la respuesta "incorrecta" simplemente porque no todos los valores reales son representables por flotantes (o dobles, para el caso). Lo que obtendrá es una aproximación basada en la codificación subyacente.
Para representar cada valor real, incluso entre 1.0x10 -100 y 1.1x10 -100 (una gama verdaderamente minúscula), que todavía requieren un número infinito de bits.
Los valores de IEEE754 de precisión única solo tienen 32 bits disponibles (algunos de los cuales están asignados a otras funciones, como representaciones de exponente y NaN/Inf) y, por lo tanto, no pueden ofrecer una precisión infinita. En realidad tienen 23 bits disponibles que dan una precisión de aproximadamente 2 (hay un bit implícito adicional) o poco más de 7 dígitos decimales (log (2) es aproximadamente 7,2).
Adjunto la palabra "incorrecta" entre comillas porque no es en realidad mal. Lo que está mal es su comprensión acerca de cómo las computadoras representan los números (no se ofenda, no está solo en este malentendido).
Diríjase a http://www.h-schmidt.net/FloatApplet/IEEE754.html y escriba su número en el cuadro "Representación decimal" para ver esto en acción.
Si desea un número más preciso, use dobles en lugar de flotantes; estos tienen el doble de bits disponibles para representar valores (suponiendo que su implementación C utiliza tipos de datos de precisión simple y doble IEEE754 para flotación y doble respectivamente).
Si desea una precisión arbitraria, necesitará usar una biblioteca "bignum" como GMP, aunque eso es algo más lento que los tipos nativos, así que asegúrese de entender las compensaciones.
sabía que esto sucedió en el caso de C#. Pero nunca se supo en el caso de C. – anonymous
El "flotador" de C también tiene un tipo de precisión fijo, por lo que no hay diferencia con C#. –