est quelque chose de cassé ou je ne comprends pas ce qui se passe? avec sortie: p>
5 Réponses :
Les numéros de points flottants ne sont pas étendus uniformément sur la ligne de numéro comme des types d'entier sont. Ils sont plus densément emballés près de 0 et très éloignés que vous approchez de l'infini. Par conséquent, il n'y a pas de constante que vous pouvez ajouter à un numéro de point flottant pour accéder au prochain numéro de point flottant. P>
Comment se peut-il? Nous avons une mantissie et un exposant. Et ni la faveur 0.
@Tontyennis: L'exposant est juste que - un exposant. Sans simplification d'un peu, une valeur de numéro de point flottant est quelque chose comme Mantissa * 2 ^ Exponent code>. C'est-à-dire que la quantité de modification de la modification de la mantissée change le nombre résultant dépend entièrement de la valeur de l'exposant. Plus l'exposant est inférieur, plus le changement sera petit.
L'idée générale est d'abord convertir le double à sa longue représentation (en utilisant EDIT: Java (depuis 1.5) fournit doubletétolongbits code> comme vous l'avez fait dans
getRealbinary code>), incrémente à long de 1, et enfin convertir le Nouveau retour au double, il représente via
longbittstodouble code>. p>
math.ulp (double) code>, que je suppose que vous pouvez utiliser pour calculer la prochaine valeur supérieure directement ainsi:
x + math.ulp (x) code>. p>
Depuis Java 1.6, il y a math.nexttabilter (début, direction) code> , qui est beaucoup plus fiable. Il gère même des cas particuliers tels que autour de zéro.
Votre code n'est pas bien formé. Vous essayez d'ajouter la double valeur minimale et attendez-vous au résultat d'être différent de la valeur d'origine. Le problème est que double.Minvalue est si petit que le résultat est arrondi et ne s'affiche pas. P>
Lecture suggérée: http://fr.wikipedia.org/wiki/machine_epsilon p>
sur l'article Wikipedia, il y a aussi le code Java. Epsilon est par définition le plus petit nombre tel que (x + eps * x! = X) et EPS * x s'appelle "Relative-Epsilon" P>
Si vous souhaitez utiliser la classe BigDecimal, il existe également la méthode bigdecimal.ulp () code>. p>
Depuis Java 1.8, il y a java.lang.math.nextup (double) code> faire exactement ce que vous voulez. Il y a aussi opposé
java.lang.math.nextdown (double) code>. P>
Qu'essayez-vous de faire? Quelle est ta question?
Ma question est la suivante: «Comment modifier le double par son plus petit incrément», et c'est mon effort ce qui a échoué.
Pourquoi ne pas simplement modifier ces bits si vous voulez faire le plus petit incrément, il échoue pour 1 et 2 parce que min_value est minuscule (vraiment petit) de 0 + vraiment petit = vraiment petit, mais 2 et plus vraiment petit ~ = 2 c'est à cause de flottant Point Le min_value est avec le point aussi loin que possible que possible pendant deux, il est quelque part au milieu, laissé perd. Vous pouvez voir ses 300 chiffres après le point que la différence devrait être, Wheraes un double stocke seulement environ 15 à 20 chiffres significatifs.
Notez à soi-même: '--n> 0;' aurait dû être '--n> = 0;'.