Pregunta

¿Cuál es el mayor número entero de "no-flotante" que puede ser almacenada en un tipo de doble IEEE 754 sin perder precisión?

¿Fue útil?

Solución

El mayor / entero más grande que se puede almacenar en un doble sin perder precisión es el mismo que el valor más grande posible de un doble. Es decir, DBL_MAX o aproximadamente 1,8 × 10 308 (si su matrimonio es un IEEE 754 de 64 bits doble). Es un entero. Está representado exactamente. ¿Qué más quieres?

Vamos, me pregunta lo que es el mayor entero, tal que y todos los números enteros más pequeños se puede almacenar en IEEE de 64 bits se duplica sin perder precisión. Un IEEE de 64 bits tiene doble 52 bits de mantisa, así que creo que es 2 53 :

  • 2 53 + 1 no puede ser almacenada, debido a que el 1 en la salida y el 1 al final tienen demasiados ceros en el medio.
  • Cualquier cosa menos de 2 53 se pueden almacenar, con 52 bits almacenados de forma explícita en la mantisa, y luego el exponente en efecto dándole otro.
  • 2 53 , obviamente, puede ser almacenado, ya que es una pequeña potencia de 2.

Otra forma de ver las cosas: una vez que el sesgo se ha quitado el exponente, y haciendo caso omiso del bit de signo como irrelevante a la pregunta, el valor almacenado por un doble es una potencia de 2, además de un número entero de 52 bits multiplicado por 2 exponente - 52 . Así que con exponente 52 puede almacenar todos los valores desde 2 52 a través de 2 53 - 1. Luego, con exponente 53, el siguiente número que puede almacenar después de 2 53 es 2 53 + 1 × 2 53-52 . Así se produce una pérdida de precisión en primer lugar con 2 53 +1.

Otros consejos

9007199254740992 (que es 9,007,199,254,740,992) sin garantías:)

Programa

#include <math.h>
#include <stdio.h>

int main(void) {
  double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
  while (dbl + 1 != dbl) dbl++;
  printf("%.0f\n", dbl - 1);
  printf("%.0f\n", dbl);
  printf("%.0f\n", dbl + 1);
  return 0;
}

Resultado

9007199254740991
9007199254740992
9007199254740992

Wikipedia tiene esto que decir en el mismo contexto con un enlace a IEEE 754 :

  

en un sistema informático típico, un 'doble precisión' (64-bit) número de punto flotante binario tiene un coeficiente de 53 bits (uno de los cuales está implícito), un exponente de 11 bits, y un bit de signo.

2 ^ 53 es un poco más de 9 * 10 ^ 15.

El número entero más grande que puede representarse en IEEE 754 doble (64 bits) es el mismo que el valor más grande que el tipo puede representar, ya que el valor es en sí un número entero.

Esto se representa como 0x7FEFFFFFFFFFFFFF, que se compone de:

  • El bit de signo 0 (positivo) en lugar de 1 (negativo)
  • El 0x7FE máximo exponente (2046 que representa 1023 después de que el sesgo se resta) en lugar de 0x7FF (2047 que indica un NaN o infinito).
  • El máximo 0xFFFFFFFFFFFFF mantisa que es de 52 bits de todos 1.

En binario, el valor es el implícito 1 seguido de otros 52 los de la mantisa, a continuación, 971 ceros (1023 - 52 = 971). Desde el exponente

El valor decimal exacto es:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

Esto es aproximadamente 1,8 x 10 308 .

Es necesario mirar el tamaño de la mantisa. Un IEEE 754 de 64 bits número de punto flotante (que tiene 52 bits, más 1 implícita) pueden representar exactamente números enteros con un valor absoluto de menos de o igual a 2 ^ 53.

DECIMAL_DIG de <float.h> debe dar por lo menos una aproximación razonable de eso. Desde que se ocupa de dígitos decimales, y es realmente almacenados en el sistema binario, es probable que pueda almacenar algo un poco más grande sin perder precisión, pero la cantidad exacta es difícil de decir. Supongo que debe ser capaz de entenderlo desde FLT_RADIX y DBL_MANT_DIG, pero no estoy seguro de que me fío completamente el resultado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top