web-dev-qa-db-fra.com

La précision change-t-elle légèrement lors du casting int pour doubler en Java?

J'ai lu ceci - Pourquoi les nombres à virgule flottante sont-ils inexacts?

Ainsi, parfois la précision peut être modifiée en nombre à virgule flottante en raison de son style de représentation (notation scientifique avec un exposant et une mantisse).

Mais si je transforme une valeur entière en double, y a-t-il une chance de changer légèrement la précision du double en Java?

Je veux dire,

    int i = 3;
    double d = (double) i;

    System.out.println(d);

la sortie que j'ai eu 3.0 comme je l'attendais.

mais y a-t-il une chance que la précision soit modifiée comme 3.000001 à cause du style de représentation du double en Java?

25
Uzzal Podder

Pas pour int pour doubler, mais vous pourriez pour longtemps doubler (ou int pour flotter):

  • Tous ne désirent pas tous plus de 2^53-1 (ou moins de -2^53) peut être représenté exactement par un double;
  • Pas tous les entiers supérieurs à 2^24-1 (ou moins de -2^24) peut être représenté exactement par un flottant.

Cette restriction résulte du nombre de bits utilisés pour représenter la mantisse (53 en doubles, 24 en flottants).

33
Andy Turner

Vous pouvez itérer sur i jusqu'à ce que vous trouviez un 2**i double qui est égal à 2**i + 1:

import Java.util.stream.IntStream;

public class PrecisionLoss
{
    public static void main(String[] args) {
        double epsilon = 1;
        Integer maxInt = IntStream.iterate(0, i -> i + 1)
                .filter(i -> Math.pow(2, i) == Math.pow(2, i) + epsilon)
                .findFirst().getAsInt();
        System.out.println("Loss of precision is greater than " + epsilon
                + " for 2**" + maxInt + " when using double.");
    }
}

Il génère:

Loss of precision is greater than 1.0 for 2**53 when using double.

Ce qui confirme l'acceptation réponse .

Notez qu'en Javascript, il n'y a pas de type entier et des doubles sont utilisés à la place (ils sont appelés Numbers). S'ils sont assez grands, les Numbers consécutifs peuvent être égaux les uns aux autres .

5
Eric Duminil