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?
Pas pour int pour doubler, mais vous pourriez pour longtemps doubler (ou int pour flotter):
2^53-1
(ou moins de -2^53
) peut être représenté exactement par un double;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).
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 Number
s). S'ils sont assez grands, les Number
s consécutifs peuvent être égaux les uns aux autres .