truncar redondear quitar numero los limitar imprimir float entre diferencia decimales cortar como floating-point

floating-point - quitar - redondear a dos decimales python



PrecisiĆ³n decimal de flotadores (2)

equivalente a log10 (2 ^ 24) ≈ 7.225 dígitos decimales

Wikipedia

Precisión: 7 dígitos

MSDN

6

std::numeric_limits<float>::digits10

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


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


Si tiene dudas, lea las especificaciones. 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

Esos están definidos en el estándar C; vamos a buscarlo allí:

número de dígitos decimales, q, tal que cualquier número de coma flotante con q dígitos decimales puede redondearse en un número de coma flotante con p radix dígitos b y viceversa sin cambio a los q dígitos decimales.

Así que std::numeric_limits<float>::digits10 es la cantidad de dígitos decimales, de modo que cualquier número de coma flotante con tantos dígitos no cambia si lo convierte en un float y regresa a decimal.

Como dices, los flotantes tienen aproximadamente 7 dígitos de precisión decimal, pero el error en la representación de los decimales y flotantes de ancho fijo no es uniformemente logarítmico. El error relativo al redondear un número de la forma 1.xxx .. a un número fijo de decimales es casi diez veces mayor que el error relativo de redondear 9.xxx .. al mismo número de 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 de float ; puede escribir fácilmente un programa para probar exhaustivamente todos ellos si todavía no está convencido.