variable tipos tipo que programacion float ejemplo datos dato c# java floating-point integer double

c# - tipos - Rango de enteros que pueden expresarse precisamente como flotantes/dobles



variable double (1)

¿Cuál es el rango exacto de enteros (contiguos) que se puede expresar como un doble (o flotación?) La razón por la que pregunto es porque tengo curiosidad por preguntas como esta cuando se producirá una pérdida de precisión.

Es decir

  1. ¿Cuál es el número entero menos positivo m modo que m+1 no se puede expresar con precisión como un doble (o flotación flotante)?
  2. ¿Cuál es el mayor entero negativo -n tal que -n-1 no se puede expresar con precisión como un doble (o flotación)? (Puede ser el mismo que el anterior).

Esto significa que cada número entero entre -n y m tiene una representación exacta de coma flotante. Básicamente busco el rango [-n, m] para flotadores y dobles.

Limitemos el alcance a las representaciones estándar IEEE 754 de coma flotante de 32 y 64 bits. Sé que el flotador tiene 24 bits de precisión y el doble tiene 53 bits (ambos con un bit de ventaja oculto), pero debido a las complejidades de la representación en coma flotante, estoy buscando una respuesta autorizada para esto. Por favor, no muevas tus manos!

(La respuesta ideal demostraría que todos los enteros de 0 a m son expresables, y que m+1 no lo es).


Ya que está preguntando sobre los tipos de coma flotante IEEE, el idioma no importa.

#include <iostream> using namespace std; int main(){ float f0 = 16777215.; // 2^24 - 1 float f1 = 16777216.; // 2^24 float f2 = 16777217.; // 2^24 + 1 cout << (f0 == f1) << endl; cout << (f1 == f2) << endl; double d0 = 9007199254740991.; // 2^53 - 1 double d1 = 9007199254740992.; // 2^53 double d2 = 9007199254740993.; // 2^53 + 1 cout << (d0 == d1) << endl; cout << (d1 == d2) << endl; }

Salida:

0 1 0 1

Entonces el límite para flotar es 2 ^ 24. Y el límite para el doble es 2 ^ 53. Los negativos son los mismos ya que la única diferencia es el bit de signo.