2011-06-06 7 views
8

numeric_limits::espilon devuelve la diferencia entre 1 y el siguiente doble. Entonces, ¿debería entender que la distancia entre dos dobles adyacentes no es siempre la misma, por ejemplo entre 2 y el siguiente doble?std: numeric_limits <double> :: epsilon definition

Y si es así, ¿podría darme una explicación?

Respuesta

16

La "densidad" de números de punto flotante disminuye mucho a medida que más lejos de cero.

Esto se debe a que el punto flotante IEEE se almacena esencialmente como notación científica, por lo que se prefiere el rango con respecto a la precisión uniforme. (Si se trata de precisión uniforme, sería de punto fijo, no de coma flotante.)

En otras palabras, los números se almacenan en forma significand * 2 exponente, por lo que si el exponente se hace grande, un pequeño cambio en el significado produce un gran cambio en el número (y viceversa).

Así que no, no puede suponer que la diferencia entre 2 y el siguiente doble es la misma que épsilon; no lo es

+2

Puede valer la pena señalar que esta es una opción de diseño consciente: a menudo es útil tener una alta precisión cerca de cero, mientras que somos más tolerantes con números más grandes. Así que float/double es un buen tipo de datos completo que * a menudo * es lo suficientemente bueno para números precisos, pequeños y en general, pero menos precisos. Es un intento de hacer que un tipo de datos simple de 32 o 64 bits sea lo más útil posible. De todos modos, +1 de mi parte – jalf

2

Los dobles son números flotantes. Consisten en un signum, un significando y un exponente.

Cuanto mayor sea el exponente, mayor será la diferencia entre un doble y su sucesor.

Cuanto menor es el exponente, menor es la diferencia entre un doble y su sucesor.

Cuestiones relacionadas