2010-07-22 14 views
10

equivalentes a log10 (2^24) ≈ 7.225 dígitos decimalesprecisión decimal de flotadores

Wikipedia

Precision: 7 dígitos

MSDN

std::numeric_limits<float>::digits10 

Por qué numeric_limits retorno 6 aquí? Tanto Wikipedia como MSDN informan que las carrozas tienen 7 dígitos decimales de precisión.

+1

Supongo que quería decir std :: numeric_limits :: digits10, ¿verdad? – Scharron

+0

@Scharron: Bien, gracias por detectar esto. Copiar y pegar error. – liori

+0

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

Respuesta

13

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.

+0

reg. "pero todos los decimales de seis dígitos", ¿qué pasa con 0.3 (decimal)? ¿Puedes elaborar más sobre ese tipo de números? –

+1

0.3 convertido a flotación (asumiendo que la IEEE-754 con precisión simple aquí) es exactamente '0.300000011920928955078125'. Cuando ese valor se redondea a seis dígitos decimales, el resultado es 0.3, por lo que no se modifica cuando está flotante y regresa a decimal con seis dígitos. Esto es cierto para todos los decimales de seis dígitos en el rango representable de 'float'. –

+0

Por decimales de ancho fijo, te refieres a [números de punto fijo] (http://en.wikipedia.org/wiki/Q_%28number_format%29) o tipos integrales? – legends2k

2

En realidad, solo hay 23 bits en la mantisa (hay un implícito 1, por lo que es efectivamente de 24 bits, pero obviamente el 1 no varía). Esto le da 6.923689900271567 dígitos decimales de precisión, que no es exactamente 7.

+0

Obviamente no. Todos los números normalizados tienen este implícito 1. Pero su comentario me recordó los números desnormalizados, que tienen menos bits de precisión. Gracias. – liori