Ich möchte eine Möglichkeit, (x + y)/2
für zwei ganze Zahlen x, y in Java zu berechnen. Die naive Art leidet unter Problemen, wenn x + y & gt; Integer.MAX_VALUE oder & lt; Integer.MIN_VALUE.
Guava IntMath
verwendet diese Technik:
... aber dies läuft auf die negative Unendlichkeit zu, was bedeutet, dass die Routine nicht mit der naiven Art für Werte wie {-1, -2} (die -2 statt -1 ergeben) übereinstimmt.
Gibt es eine entsprechende Routine, die in Richtung 0 abschneidet?
"Benutze einfach long
" ist nicht die Antwort, nach der ich suche, da ich eine Methode haben möchte, die auch für lange Eingaben funktioniert. BigInteger
ist auch nicht die Antwort, nach der ich suche. Ich möchte keine Lösung mit irgendwelchen Zweigen.
Sie müssen 1
zum Ergebnis hinzufügen, wenn die niedrigsten Bits unterschiedlich sind (das Ergebnis ist also nicht exakt und Sie müssen runden), und das Vorzeichenbit im Ergebnis wird gesetzt (das Ergebnis ist negativ, also Sie möchte die Abrundung in eine Zusammenfassung umwandeln).
Also sollte folgendes tun (ungetestet):
%Vor%Tags und Links java math overflow bit-manipulation