92 votes

Combien de numéros doubles est entre 0.0 et 1.0 ?

C'est quelque chose qui a été dans mon esprit pendant des années, mais je n'ai jamais pris le temps de lui demander avant.

Beaucoup de (pseudo) des générateurs de nombres aléatoires générer un nombre aléatoire compris entre 0.0 et 1.0. Mathématiquement, il y a nombre infini de cette gamme, mais double est un nombre à virgule flottante, et, par conséquent, a une précision limitée.

Donc les questions sont:

  1. Juste combien de double chiffres compris entre 0.0 et 1.0?
  2. Sont là autant de nombres entre 1 et 2? Entre 100 et 101? Entre 10^100 et 10^100+1?

Remarque: si cela fait une différence, je suis intéressé dans de Java définition de l' double en particulier.

67voto

Alex Martelli Points 330805

Java doubles sont dans la norme IEEE-754 format, donc ils ont un 52 bits fraction; entre deux adjacents puissances de deux (inclusive et exclusive de la suivante), il y aura donc 2 à la 52ème édition de puissance différente doubles (c'est à dire, 4503599627370496 d'entre eux). Par exemple, c'est le nombre de distinct doubles compris entre 0,5 et 1,0 exclus, et exactement ce que beaucoup de se trouvent également entre 1.0 inclus et 2.0 exclus, et ainsi de suite.

Le comptage de l' doubles entre 0.0 et 1.0 est plus difficile que de le faire entre les puissances de deux, parce qu'il y a beaucoup de puissances de deux inclus dans cette gamme, et, aussi, l'on obtient dans les questions épineuses de les nombres dénormalisés. 10 de 11 bits des représentants de couvrir toute la gamme en question, donc, y compris les nombres dénormalisés (et je pense que quelques types d' NaN), vous avez de 1024 fois l' doubles en tant que laïcs, entre les puissances de deux -- pas plus que 2**62 au total, de toute façon. À l'exclusion de dénormalisée &c, je crois que le compte serait 1023 fois 2**52.

Pour une gamme arbitraire comme "100 100.1" il est encore plus difficile parce que la limite supérieure ne peut pas être représentée exactement comme un double (n'étant pas un multiple exact de la toute puissance de deux). Pratique approximation, puisque la progression entre les puissances de deux est linéaire, on peut dire que a dit de la gamme est 0.1 / 64th de la durée entre les puissances de deux (64 et 128), de sorte que vous vous attendez à propos de

(0.1 / 64) * 2**52

distinctes doubles -- qui vient à l' 7036874417766.4004... donner ou de prendre un ou deux;-).

41voto

Stephen Canon Points 58003

Chaque double de la valeur dont la représentation est entre 0x0000000000000000 et 0x3ff0000000000000 se trouve dans l'intervalle [0.0, 1.0]. C'est (2^62 - 2^52) valeurs distinctes (plus ou moins une couple selon que vous comptez les points de terminaison).

L'intervalle [1.0, 2.0] correspond à des représentations entre 0x3ff0000000000000 et 0x400000000000000; 2^52 valeurs distinctes.

L'intervalle [100.0, 101.0] correspond à des représentations entre 0x4059000000000000 et 0x4059400000000000; 2^46 valeurs distinctes.

Il n'y a pas de doubles entre 10^100 et 10^100 + 1. Ni l'un de ces nombres est représentable en double précision, et il n'y a pas le double de celle de l'automne entre eux. Le plus proche de deux nombres double précision sont:

99999999999999982163600188718701095...

et

10000000000000000159028911097599180...

7voto

Mark Dickinson Points 6780

D'autres l'ont déjà expliqué qu'il y a autour de 2^62 doubles dans l'intervalle [0.0, 1.0].
(Pas très étonnant: il y a près de 2^64 distinctes finis doubles, dont la moitié sont positifs, et environ la moitié de ceux qui sont < 1.0.)

Mais vous mentionnez des générateurs de nombres aléatoires: veuillez noter qu'un générateur de nombre aléatoire de générer des nombres compris entre 0.0 et 1.0 ne peut pas en général de produire tous ces numéros; en général, il ne fera que produire des nombres de la forme n/2^53 avec n un entier (voir, par exemple, la documentation de Java pour nextDouble). Donc, il ya habituellement seulement environ 2^53 (+/-1, selon les points de terminaison sont inclus) valeurs possibles pour l' random() de la production. Cela signifie que la plupart des doubles dans [0.0, 1.0] ne sera jamais produite.

3voto

Mark Rushakoff Points 97350

L'article de Java de nouvelles mathématiques, Partie 2: les nombres à virgule Flottante à partir de IBM propose l'extrait de code suivant pour résoudre ce (dans la flotte, mais je soupçonne que cela fonctionne pour les doubles):

public class FloatCounter {

    public static void main(String[] args) {
        float x = 1.0F;
        int numFloats = 0;
        while (x <= 2.0) {
            numFloats++;
            System.out.println(x);
            x = Math.nextUp(x);
        }
        System.out.println(numFloats);
    }
}

Ils ont ce commentaire:

Il s'avère exactement 8,388,609 flotte entre 1.0 et 2.0 inclusive; les grands mais à peine les innombrables infinité de nombres réels qui existent dans cette gamme. Successives les numéros sont sur le 0.0000001 à part. Cette distance est appelée une pratique de travail déloyale pour les unités de moins de précision ou de l'unité à la dernière place.

2voto

Yann Ramin Points 25139
<ol> <li>2 ^ 53 - la taille de la mantisse/mantisse d’un 64 bits, y compris le bit caché nombre à virgule flottante.</li> <li>À peu près Oui, car la sifnificand est fixe mais les changements exposants.</li> </ol> <p>Voir l' <a href="http://en.wikipedia.org/wiki/Double_precision" rel="nofollow">article de wikipedia</a> pour plus d’informations.</p>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X