resueltos representar que punto para online numeros numero numericos normalizada norma metodos mantisa informatica flotante estandar ejercicios coma math language-agnostic floating-point

math - representar - punto flotante metodos numericos



¿Qué tipos de números se pueden representar en punto flotante binario? (4)

La regla se puede resumir así:

  • Un número puede representarse exactamente en binario si la factorización prima del denominador contiene solo 2. (es decir, el denominador es una potencia de dos)

Entonces 1/(32 + 16) no es representable en binario porque tiene un factor de 3 en el denominador. Pero 1/32 + 1/16 = 3/32 es.

Dicho esto, hay más restricciones que se pueden representar en un tipo de punto flotante. Por ejemplo, solo tiene 53 bits de mantisa en una double IEEE, por lo que 1/2 + 1/2^500 no se puede representar.

Así que puedes hacer la suma de las potencias de dos siempre que el rango de los exponentes no abarque más de 53 potencias.

Para generalizar esto a otras bases:

  • Un número puede representarse exactamente en la base 10 si la factorización prima del denominador consiste solo en 2 y 5.

  • Un número racional X puede representarse exactamente en la base N si la factorización prima del denominador de X contiene solo los números primos encontrados en la factorización de N

He leído mucho sobre flotadores, pero todo es innecesariamente involucrado. Creo que lo tengo bastante entendido, pero solo hay una cosa que me gustaría saber con seguridad:

Sé que las fracciones de la forma 1/pow(2,n) , con n un entero, pueden representarse exactamente en números de punto flotante. Esto significa que si agrego 1/32 a sí mismo 32 millones de veces, obtendría exactamente 1,000,000 .

¿Qué pasa con algo como 1/(32+16) ? Es uno sobre la suma de dos poderes de dos, ¿esto funciona? ¿O es 1/32+1/16 que funciona? Aquí es donde estoy confundido, así que si alguien pudiera aclarar eso, lo apreciaría.


Los números de punto flotante se representan literalmente mediante el formulario:

1.m * 2^e

Donde 1.m es una fracción binaria y e es un entero positivo o negativo.

Como tal, puedes representar 1/32 + 1/16 exactamente, como:

1.1000000 * 2^-4

( 1.10 es la fracción binaria equivalente a 1.5.) 1/48 , sin embargo, no se puede representar en este formato.


Un número finito se puede representar en el formato común de doble precisión IEEE 754 si y solo si es igual a M • 2 e para algunos enteros M y e, de manera que -2 53 <M <2 53 y -1074 ≤ e ≤ 971.

Para precisión simple, -2 24 <M <2 24 y -149 ≤ e ≤ 104.

Para precisión doble, estas son consecuencias de los hechos de que el formato de precisión doble utiliza 52 bits para almacenar un significando (que normalmente tiene 53 bits debido a un 1 implícito) y utiliza 11 bits para almacenar un exponente. 11 bits codifica números del 0 al 2047, pero 0 y 2047 se excluyen para propósitos especiales, y el número codificado está sesgado en 1023, por lo que representa exponentes no sesgados de -1022 a 1023. Sin embargo, estos exponentes no sesgados son para significandos en el intervalo [1, 2), y esos significandos tienen fracciones. Para expresar el significando como un entero, ajusté el rango del exponente en 52. La precisión simple es similar, con 23 bits para almacenar un significando de 24 bits, 8 bits para el exponente y un sesgo de 127.

Expresar los números representables usando un número entero por una potencia de dos en lugar del significado fraccionario más común, simplifica la teoría de números y otros razonamientos sobre las propiedades de punto flotante. Lo utilicé en esta respuesta porque permite que el conjunto de valores representables se exprese de manera concisa.


Un punto que aún no se ha mencionado es que, semánticamente, un número de punto flotante puede considerarse mejor como un rango de valores. El rango de valores tiene un punto central definido con mucha precisión, y la especificación IEEE generalmente requiere que el resultado de un cálculo de punto flotante sea el número cuyo rango contenga el punto que se obtendría operando sobre los puntos centrales de los números originales. pero en la secuencia:

double N1 = 0.1; float N2 = (float)N1; double N3 = N2;

N2 es la representación correcta e inequívoca de una sola precisión del valor que se había representado en N1, a pesar del requisito estúpido del idioma para usar una conversión explícita. N3 representará uno de los valores que N2 podría representar (la especificación del idioma es elegir el valor double cuyo rango se centra en la mitad del rango del float ). Tenga en cuenta que mientras N2 representa el valor de su tipo cuyo rango contiene el valor correcto, N3 no lo hace.

Incidentalmente, la conversión de un número de una cadena a un flotador en los idiomas .net y .net parece pasar a una conversión intermedia a double , lo que a veces puede alterar el valor. Por ejemplo, aunque el valor 13571357 se puede representar como un flotador de precisión simple, el valor 13571357.49999999999069f se redondea a 13571358 (aunque obviamente es más cercano a 13571357).