6
votes

Comment les magasins Java flottent v double

Je réalise qu'un nombre décimal ne peut être aussi précis que de manière précise comme un flotteur dans un système binaire, mais ce que je ne comprends pas est ce qui se passe à l'endroit 7 décimal de ma production de 10/7.

dans mon Premier test de sortie J'ai remarqué que la 7 (7ème place) à la fin du flotteur V La 4 (7ème place) suivie d'un 2 dans le double. Je penserais que la 7ème place dans le flotteur serait une 4 depuis la 8ème place du double est une 2. P>

float 1.4285715 Double 1.4285714285714286 P>

J'ai ensuite exécuté le prochain test de sortie en utilisant le format de flotteur à 17 places. La 8ème place de chacune est différente - le flotteur est un 6 c'est pourquoi la 7ème place est arrondie à 5 je suppose. P>

float 1.428571462631225600 Double 1.428571428571428600 P>

Dans le troisième test de sortie, j'ai essayé une distribution directe avec le format de chaîne pour voir ce qui se passerait. J'ai eu les mêmes résultats que le deuxième test. P>

Si j'ai une question simpliste à une méthode de stockage de points flottant complexe - je m'excuse. P>

    float f = 10/7f;
    double d = 10/7d;

    System.out.format
        ("Float  %1s\nDouble %2s\n", f,d);
    /*
     *  Float  1.4285715
        Double 1.4285714285714286
     */

    System.out.format
        ("Float  %1$.17f\nDouble %2$.17f\n", f,d);
    /*
     *  Float  1.428571462631225600
        Double 1.428571428571428600
     */

    System.out.format
        ("Float  %1s\nDouble %2s\n", (double)f,d);
    /*
     *  Float  1.4285714626312256
        Double 1.4285714285714286
     */


2 commentaires

Quelle est exactement votre question? (Je ne vois aucun point d'interrogation dans votre message ...)


C'est à quel point la double est stockée: - en.wikipedia.org/wiki/double-precision_floating-point_Format


4 Réponses :



2
votes

Pour une explication simplifiée, essayez ce site:

http://floatinat-point-gui.de/basic/

Pour une explication très détaillée, essayez ceci:

http://docs.oracle.com/cd/ E19957-01 / 806-3568 / NCG_GOLDBERG.HTML


0 commentaires

1
votes

Il semble que lorsque vous utilisez un float , il utilise une précision par défaut de 8 chiffres pour ce numéro. Lorsque vous spécifiez une précision, il est clair que cela utilise réellement double pour calculer la valeur.


0 commentaires

7
votes

Dans mon premier test de sortie, j'ai remarqué que la 5 (7ème place) à la fin du flotteur V La 4 (7ème place) suivie d'un 2 dans le double. Je pense que la 7ème place dans le flotteur serait une 4 depuis la 8ème place dans le double est une 2.

Cette attente n'a de sens que si vous pensez que des flotteurs sont stockés en interne en décimal et arrondi à un certain nombre de chiffres décimaux. Mais ce n'est pas vrai, les flotteurs sont stockés en interne dans binaire et arrondi à un certain nombre de chiffres binaires .

Vos attentes sont basées sur un malentendu de la manière dont les numéros de points flottants sont stockés. Vous voyez des doubles uniquement avoir des décimales plus précis que parce que cela en ressort d'un lieu binaire plus précis. La mise en œuvre ne stocke pas les chiffres sous une forme décimale du tout.


1 commentaires

UPVOTED pour l'explication la plus précise qui explique pourquoi cela se produit.