Java a-t-il quelque chose pour représenter l'infini pour chaque type de données numériques? Comment est-il mis en œuvre pour que je puisse faire des opérations mathématiques avec?
Par exemple
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
J'ai essayé d'utiliser de très grands nombres, mais je veux une solution appropriée et simple .
∞-∞==0
être vrai? Et aussi: pourquoi avez-vous besoin d'une telle chose?Réponses:
double
prend en charge Infinityimpressions
Remarque:
Infinity - Infinity
n'est pas un nombre .la source
float
autant que possible car sa précision est assez médiocre. ;)Je suppose que vous utilisez le calcul des nombres entiers pour une raison. Si tel est le cas, vous pouvez obtenir un résultat fonctionnellement presque identique à POSITIVE_INFINITY en utilisant le champ MAX_VALUE de la
Integer
classe:(Et pour NEGATIVE_INFINITY, vous pouvez utiliser MIN_VALUE.) Il y aura bien sûr des différences fonctionnelles, par exemple, lors de la comparaison
myInf
avec une valeur qui se trouve être MAX_VALUE: clairement ce nombre n'est pas inférieur àmyInf
.Il existe également une bibliothèque qui contient en fait les champs POSITIVE_INFINITY et NEGATIVE_INFINITY, mais ce ne sont en réalité que de nouveaux noms pour MAX_VALUE et MIN_VALUE.
la source
Integer.MAX_VALUE
de l'infini plutôt que deDouble.POSITIVE_INFINITY
dire qu'ils sont «fonctionnellement presque identiques», alors quelle est la différence?Integer.MAX_VALUE
est toujours fini, c'est juste un hack pour imiter l'infini. De plus,Integer.MAX_VALUE
c'est seulement 32 bits alors queDouble.POSITIVE_INFINITY
c'est 64 bits.Pour l'utiliser
Infinity
, vous pouvez utiliserDouble
quels supportsInfinity
: -SORTIE : -
la source
Les types
Double
etFloat
ont laPOSITIVE_INFINITY
constante.la source
Je ne suis pas sûr que Java ait l'infini pour chaque type numérique, mais pour certains types de données numériques, la réponse est positive:
ou
Vous pouvez également trouver utile l'article suivant qui représente certaines opérations mathématiques impliquant +/- infini: Intricacités de nombres à virgule flottante Java .
la source
Seuls les types Double et Float prennent
POSITIVE_INFINITY
en charge la constante.la source
Pour les types d'encapsuleurs numériques.
par exemple Double.POSITVE_INFINITY
J'espère que cela pourrait vous aider.
la source
Une solution générique consiste à introduire un nouveau type. Il est peut-être plus compliqué, mais il a l'avantage de fonctionner pour tout type qui ne définit pas sa propre infinité.
Si
T
est un type pour lequellteq
est défini, vous pouvez définirInfiniteOr<T>
aveclteq
quelque chose comme ceci:Je vous laisse le soin de traduire cela dans la syntaxe Java exacte. J'espère que les idées sont claires; mais laissez-moi les épeler de toute façon.
L'idée est de créer un nouveau type qui a toutes les mêmes valeurs que certains types déjà existants, plus une valeur spéciale qui - pour autant que vous puissiez en juger par les méthodes publiques - agit exactement comme vous voulez que l'infini agisse, par exemple, il est supérieur à rien d'autre. J'utilise
null
pour représenter l'infini ici, car cela semble le plus simple en Java.Si vous souhaitez ajouter des opérations arithmétiques, décidez de ce qu'elles doivent faire, puis implémentez-la. C'est probablement plus simple si vous gérez d'abord les cas infinis, puis réutilisez les opérations existantes sur des valeurs finies du type d'origine.
Il pourrait ou non y avoir un modèle général pour savoir s'il est avantageux ou non d'adopter une convention de gestion des infinis de gauche avant les infinis de droite ou vice versa; Je ne peux pas dire sans l'essayer, mais pour moins que ou égal (
lteq
), je pense qu'il est plus simple de regarder d'abord l'infini de droite. Je note que celteq
n'est pas commutatif, maisadd
etmul
sont; c'est peut-être pertinent.Remarque: trouver une bonne définition de ce qui doit se passer sur des valeurs infinies n'est pas toujours facile. C'est pour la comparaison, l'addition et la multiplication, mais peut-être pas la soustraction. En outre, il existe une distinction entre les nombres cardinaux et ordinaux infinis auxquels vous voudrez peut-être faire attention.
la source
-(yourvalue)
fonctionne correctement. Et cela vous permettrait également de prendre en charge le concept NaN (pas un nombre). En dehors de cela, ajouter des valeurs spéciales au-dessus des types intégraux peut être une bonne idée, en particulier lorsque l'application a besoin d'une sémantique violée par des nombres à virgule flottante.Puisque la classe Number n'est pas définitive, voici une idée, que je ne trouve pas encore dans les autres articles. À savoir pour sous-classer la classe Number.
Cela fournirait en quelque sorte un objet qui peut être traité comme l'infini pour Integer, Long, Double, Float, BigInteger et BigDecimal.
Comme il n'y a que deux valeurs, nous pourrions utiliser le modèle singleton:
D'une manière ou d'une autre, je pense que les méthodes restantes intValue (), longValue () etc. devraient alors être surchargées pour lancer des exceptions. De sorte que la valeur infinie ne peut être utilisée sans précautions supplémentaires.
la source
Je suis un débutant en Java ... J'ai trouvé une autre implémentation pour l'infini dans la documentation Java, pour les types
boolean
etdouble
. https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3Ça a l'air moche, mais ça marche.
la source