9
votes

Comment modifier le double par son plus petit incrément

est quelque chose de cassé ou je ne comprends pas ce qui se passe? xxx

avec sortie: xxx


4 commentaires

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;'.


5 Réponses :


7
votes

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.


2 commentaires

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 . 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.



8
votes

L'idée générale est d'abord convertir le double à sa longue représentation (en utilisant doubletétolongbits comme vous l'avez fait dans getRealbinary ), incrémente à long de 1, et enfin convertir le Nouveau retour au double, il représente via longbittstodouble .

EDIT: Java (depuis 1.5) fournit math.ulp (double) , que je suppose que vous pouvez utiliser pour calculer la prochaine valeur supérieure directement ainsi: x + math.ulp (x) .


1 commentaires

Depuis Java 1.6, il y a math.nexttabilter (début, direction) , qui est beaucoup plus fiable. Il gère même des cas particuliers tels que autour de zéro.



4
votes

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.

Lecture suggérée: http://fr.wikipedia.org/wiki/machine_epsilon

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"


0 commentaires

0
votes

Si vous souhaitez utiliser la classe BigDecimal, il existe également la méthode bigdecimal.ulp () .


0 commentaires

4
votes

Depuis Java 1.8, il y a java.lang.math.nextup (double) faire exactement ce que vous voulez. Il y a aussi opposé java.lang.math.nextdown (double) .


0 commentaires