Gesättigte Addition von zwei signierten Java-Long-Werten

8

Wie kann man zwei long -Werte in Java hinzufügen, so dass, wenn das Ergebnis überläuft, es in den Bereich Long.MIN_VALUE .. Long.MAX_VALUE ?

geklammert wird

Zum Hinzufügen von Ints kann die Arithmetik in long precision ausgeführt werden und das Ergebnis zurück in int , z. B.:

, umgewandelt werden %Vor%

oder

%Vor%

aber im Fall von long gibt es keinen größeren primitiven Typ, der die Zwischensumme (nicht geklammert) halten kann.

Da dies Java ist, kann ich nicht Inline-Assembly verwenden (insbesondere die gesättigten Add-Anweisungen von SSE) .)

Er kann mit BigInteger , z. B.

, implementiert werden %Vor%

Die Leistung ist jedoch wichtig, daher ist diese Methode nicht ideal (obwohl sie zum Testen nützlich ist).

Ich weiß nicht, ob das Vermeiden von Verzweigungen die Leistung in Java erheblich beeinträchtigen kann. Ich gehe davon aus, dass es möglich ist, aber ich möchte Methoden mit und ohne Verzweigung vergleichen.

Related: Wie Sättigung Zugabe in C tun?

    
finnw 13.04.2010, 19:01
quelle

3 Antworten

5

Sie sollten es anhand des Vorzeichens der Zahlen in vier Fälle unterteilen können: Wenn eine der Zahlen Null ist, lautet die Antwort die andere Zahl. Wenn man positiv und ein anderes negativ ist, dann kann man nicht über- oder unterlaufen. Wenn beide positiv sind, können Sie nur überlaufen. Wenn beide negativ sind, können Sie nur unterlaufen.

Machen Sie in den letzten beiden Fällen eine zusätzliche Berechnung, um zu sehen, ob dies zu dem unerwünschten Fall führt:

%Vor%     
M. Jessup 13.04.2010, 19:18
quelle
2

Hier ist mein Versuch einer zweigfreien Version:

%Vor%     
finnw 13.04.2010 21:00
quelle
1

Sie können auch den eingebauten Sättigungsmechanismus von Typcasting verwenden:

%Vor%

x und y werden als double hinzugefügt und das Umwandeln in int wird in den Bereich [Integer.MIN_VALUE, Integer.MAX_VALUE] gesättigt.

Dies ist nicht so geeignet für long s, da die Genauigkeit von double geringer ist als die von long , aber wenn die Genauigkeit nicht so wichtig ist, wird es ausreichen.

    
Lajos Molnar 13.07.2014 23:57
quelle