Java-Ergebnisse unterscheiden sich für (int) Math.pow (2, x) und 1x

8

Warum ergeben die folgenden beiden Operationen in Java unterschiedliche Ergebnisse für x = 31 oder 32 , aber dieselben Ergebnisse für x=3 ?

%Vor%

Ergebnisse:

%Vor%     
kasavbere 02.05.2012, 15:19
quelle

5 Antworten

18

Es gibt mehrere Probleme beim Spielen:

Was diese Interviewfrage zeigt, zeigt, dass (int)Math.pow(2, x) und 1 << x für Werte von x außerhalb des Bereichs 0 ... 30 nicht gleichwertig sind.

P.S. Es ist vielleicht interessant zu bemerken, dass die Verwendung von long anstelle von int (und 1L anstelle von 1 ) noch eine andere Reihe von Ergebnissen ergibt, die sich von den anderen beiden unterscheiden. Dies gilt auch dann, wenn die Endergebnisse in int konvertiert werden.

    
NPE 02.05.2012, 15:29
quelle
3

Gemäß der Dokumentation wird Math.pow beide Argumente für eine Verdopplung und eine Rückgabe an das Doppelte fördern. Offensichtlich, wenn das zurückgegebene Ergebnis doppelt ist und Sie es in int umwandeln, erhalten Sie nur die höchsten 32 Bits und der Rest wird abgeschnitten - daher erhalten Sie immer den Wert (int) Math.pow(2,x); . Wenn Sie Bitshift durchführen, arbeiten Sie immer mit Ints und daher tritt ein Überlauf auf.

    
asenovm 02.05.2012 15:24
quelle
2

Betrachten Sie die Grenzen des Typs int. Wie groß kann es sein?

    
erikxiv 02.05.2012 15:22
quelle
0

int ist 32 Bits groß und da es (standardmäßig) signiert ist, wird das erste Bit für das Zeichen verwendet. Wenn Sie die linken 31 Bits verschieben, erhalten Sie das Two's Kompliment , welches - (2 ^ 32) ist. Wenn Sie 32 Bits nach links verschieben, wird der gesamte Weg wieder auf 1 zurückgeschleift. Wenn Sie diese Verschiebung mit Longs anstelle von Ints durchführen würden, würden Sie die Antworten bekommen, die Sie erwarten (bis Sie 63+ Bits verschieben) / p>     

mrketchup 02.05.2012 15:35
quelle
0

Hier ist ein Mikro-Benchmark für den Fall eines langen. Auf meinem Laptop (2,8 GHz) ist die Verwendung von shift statt Math.pow über 7x schneller.

%Vor%     
denine99 10.08.2017 01:03
quelle