En caso de duda, lea la especificación. El estándar de C++ dice que digits10
es:
Número de base 10 dígitos que se pueden representar sin cambios.
Eso es un poco vago; Afortunadamente, hay una nota al pie:
Equivalente a FLT_DIG, DBL_DIG, LDBL_DIG
Aquellos se definen en la norma C; vamos a ver allá arriba:
número de dígitos decimales, q, de manera que cualquier número de coma flotante con dígitos q decimales se puede redondear en un número de coma flotante con B dígitos p radix y de nuevo sin cambiar los q dígitos decimales.
Así std::numeric_limits<float>::digits10
es el número de dígitos decimales de manera que cualquier número de coma flotante con esa cantidad de dígitos no varía si se lo convierte a un float
y de nuevo a decimal.
Como dices, los flotantes tienen aproximadamente 7 dígitos de precisión decimal, pero el error en la representación de ambos decimales de ancho fijo y flotantes no es uniformemente logarítmico. El error relativo al redondear un número de la forma 1.xxx .. a un número fijo de posiciones decimales es casi diez veces más grande que el error relativo de redondear 9.xxx .. al mismo número de posiciones decimales. De manera similar, dependiendo de dónde caiga un valor en un binade, el error relativo al redondearlo a 24 dígitos binarios puede variar por un factor de casi dos.
El resultado de esto es que no todos los decimales de siete dígitos sobreviven al viaje de ida y vuelta para flotar y retroceder, pero sí todos los decimales de seis dígitos. Por lo tanto, std::numeric_limits<float>::digits10
es 6.
No hay tantos decimales de seis y siete dígitos con exponentes en un rango válido para el tipo float
; puede escribir fácilmente un programa para probar exhaustivamente todos ellos si todavía no está convencido.
Supongo que quería decir std :: numeric_limits :: digits10, ¿verdad? –
Scharron
@Scharron: Bien, gracias por detectar esto. Copiar y pegar error. – liori
posible duplicado de [¿Es la precisión más significativa de los dígitos decimales que se puede convertir en binario y volver a decimal sin pérdida de importancia 6 o 7.225?] (Http://stackoverflow.com/questions/30688422/is-the-most- digitos-decimales-precisión-que-pueden-convertirse-a-binario) – Bryan