2015-11-20 1 views
3

J'essaie de comprendre combien de nombres entiers différents existent dans l'ieee 754. Le nombre que j'ai eu était 1778384895 mais je ne pourrais trouver aucune ressource pour vérifier moi-même. Merci beaucoup d'avance.combien de nombres entiers dans IEEE 754

+1

voir aussi: https://stackoverflow.com/questions/46924982/how-do-you-determine-how-many-integers-are-in-set-s- of-all-in-32-bit-ieee-floati a une réponse qui se décompose par plage d'exposants, [0..1), [1..2^24), et 2^24 vers le haut –

Répondre

8

Je vais supposer des flotteurs de précision simple.

Nous avons obtenu le zéro, qui peut être représenté par un zéro négatif, mais reste simplement zéro comme entier, donc je le compte comme un.

Les nombres dont l'exposant est inférieur à 127 ne sont pas des nombres entiers.

Exponent Free bits # Numbers 
127  0   1 
128  1   2 
129  2   4 
... 
149  22   2^22 

Ces résultats totalisent 2^23-1. Si l'exposant est supérieur à 149, tous les nombres sont des entiers. Donc c'est 105*2^23 supplémentaires (l'exposant 255 est réservé). Tous ces éléments sont positifs et négatifs.

Le grand total est donc

1 + ((2^23 - 1) + 105 * (2^23)) * 2 = 1778384895 

semble donc que vous aviez raison. Belle question, il semblait beaucoup plus facile à première vue :)

+0

c'est exactement comment Je l'ai fait, merci! – Al08

+1

Dit différemment: tous les entiers entre -2^24-1 et 2^24-1, qui sont exactement représentables, plus les binades de celui commençant à 2^24 à celui commençant à 2^127. –

3

Je suis d'accord avec Jester's answer. En guise de contre-vérification, et pour démontrer une approche alternative, j'ai écrit, en Java, un balayage en force brute de tous les nombres finis flottants, en comptant ceux qui sont des nombres entiers. Math.nextUp renvoie le plus petit flottant positif pour l'une ou l'autre forme de zéro, donc zéro ne compte qu'une seule fois.

public class Test { 
    public static void main(String[] args) { 
    long count = 0; 
    for (float f = -Float.MAX_VALUE; f <= Float.MAX_VALUE; f = Math.nextUp(f)) { 
     if (Math.rint(f) == f) { 
     count++; 
     } 
    } 
    System.out.println(count); 
    } 
} 

Il sortie 1778384895

+0

cool, merci beaucoup! – Al08