Hat Java für jeden numerischen Datentyp etwas, das Unendlichkeit darstellt? Wie ist es so implementiert, dass ich damit mathematische Operationen ausführen kann?
Z.B
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
Ich habe versucht, sehr große Zahlen zu verwenden, aber ich möchte eine richtige, einfache Lösung.
∞-∞==0
das wahr sein? Und auch: Warum brauchst du so etwas?Antworten:
double
unterstützt Infinitydruckt
Hinweis:
Infinity - Infinity
ist keine Nummer .quelle
float
wann immer möglich zu verwenden, da seine Präzision ziemlich schlecht ist. ;)Ich nehme an, Sie verwenden aus einem bestimmten Grund ganzzahlige Mathematik. In diesem Fall können Sie mithilfe des Felds MAX_VALUE der
Integer
Klasse ein Ergebnis erhalten, das funktional nahezu dem von POSITIVE_INFINITY entspricht :(Und für NEGATIVE_INFINITY können Sie MIN_VALUE verwenden.) Natürlich gibt es einige funktionale Unterschiede, z. B. beim Vergleich
myInf
mit einem Wert, der zufällig MAX_VALUE ist: Diese Zahl ist eindeutig nicht kleiner alsmyInf
.Es gibt auch eine Bibliothek mit den Feldern POSITIVE_INFINITY und NEGATIVE_INFINITY, aber es handelt sich eigentlich nur um neue Namen für MAX_VALUE und MIN_VALUE.
quelle
Integer.MAX_VALUE
als Unendlichkeit und nicht derDouble.POSITIVE_INFINITY
Aussage, dass sie "funktional nahezu gleich" sind? Was ist also der Unterschied?Integer.MAX_VALUE
ist immer noch endlich, es ist nur ein Hack, um die Unendlichkeit nachzuahmen. Darüber hinausInteger.MAX_VALUE
ist nur 32-Bit, währendDouble.POSITIVE_INFINITY
64-Bit ist.Zur Verwendung
Infinity
können Sie verwenden FürDouble
welche unterstütztInfinity
: -AUSGABE : -
quelle
Die
Double
undFloat
Typen haben diePOSITIVE_INFINITY
Konstante.quelle
Ich bin nicht sicher, ob Java für jeden numerischen Typ unendlich ist, aber für einige numerische Datentypen ist die Antwort positiv:
oder
Außerdem kann der folgende Artikel nützlich sein, der einige mathematische Operationen mit +/- unendlich darstellt: Java-Gleitkommazahlen-Komplikationen .
quelle
Nur Double- und Float-Unterstützungskonstanten
POSITIVE_INFINITY
.quelle
Für die numerischen Wrapper-Typen.
zB Double.POSITVE_INFINITY
Hoffe das könnte dir helfen.
quelle
Eine generische Lösung besteht darin, einen neuen Typ einzuführen. Es mag komplizierter sein, aber es hat den Vorteil, für jeden Typ zu arbeiten, der seine eigene Unendlichkeit nicht definiert.
Wenn
T
ein Typ , für dielteq
definiert ist, können Sie festlegen ,InfiniteOr<T>
mitlteq
etwas wie folgt aus :Ich überlasse es Ihnen, dies in die exakte Java-Syntax zu übersetzen. Ich hoffe, die Ideen sind klar; aber lassen Sie mich sie trotzdem buchstabieren.
Die Idee ist, einen neuen Typ zu erstellen, der dieselben Werte wie ein bereits vorhandener Typ hat, sowie einen speziellen Wert, der - soweit Sie dies mit öffentlichen Methoden erkennen können - genau so wirkt, wie Sie möchten, dass die Unendlichkeit wirkt, z. B. größer als noch etwas. Ich verwende hier
null
die Darstellung der Unendlichkeit, da dies in Java am einfachsten erscheint.Wenn Sie arithmetische Operationen hinzufügen möchten, entscheiden Sie, was sie tun sollen, und implementieren Sie diese. Es ist wahrscheinlich am einfachsten, wenn Sie zuerst die unendlichen Fälle behandeln und dann die vorhandenen Operationen für endliche Werte des ursprünglichen Typs wiederverwenden.
Es kann ein allgemeines Muster geben oder nicht, ob es vorteilhaft ist, eine Konvention zum Umgang mit Unendlichkeiten auf der linken Seite vor Unendlichkeiten auf der rechten Seite oder umgekehrt anzuwenden. Ich kann es nicht sagen, ohne es auszuprobieren, aber für weniger als oder gleich (
lteq
) denke ich, dass es einfacher ist, zuerst die Unendlichkeit auf der rechten Seite zu betrachten. Ich stelle fest, dasslteq
das nicht kommutativ ist, sondernadd
undmul
sind; Vielleicht ist das relevant.Hinweis: Es ist nicht immer einfach, eine gute Definition für unendliche Werte zu finden. Es dient zum Vergleich, zur Addition und Multiplikation, aber möglicherweise nicht zur Subtraktion. Außerdem wird zwischen unendlichen Kardinal- und Ordnungszahlen unterschieden, auf die Sie möglicherweise achten möchten.
quelle
-(yourvalue)
ordnungsgemäße Arbeit ermöglicht. Und das würde es Ihnen auch ermöglichen, das NaN- Konzept (keine Zahl) zu unterstützen. Abgesehen davon kann das Hinzufügen spezieller Werte zu integralen Typen eine gute Idee sein, insbesondere wenn die Anwendung eine Semantik benötigt, die durch Gleitkommazahlen verletzt wird.Da die Klassennummer nicht endgültig ist, ist hier eine Idee, die ich in den anderen Beiträgen noch nicht finde. Nämlich um die Klassennummer zu unterklassifizieren.
Dies würde irgendwie ein Objekt liefern, das für Integer, Long, Double, Float, BigInteger und BigDecimal als unendlich behandelt werden kann.
Da es nur zwei Werte gibt, können wir das Singleton-Muster verwenden:
Irgendwie denke ich, dass die verbleibenden Methoden intValue (), longValue () usw. dann überschrieben werden sollten, um Ausnahmen auszulösen. Damit kann der Unendlichkeitswert nicht ohne weitere Vorsichtsmaßnahmen verwendet werden.
quelle
Ich bin ein Anfänger in Java ... Ich habe eine andere Implementierung für die Unendlichkeit in der Java-Dokumentation gefunden, für die
boolean
unddouble
Typen. https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3Es sieht hässlich aus, aber es funktioniert.
quelle