Ce face Math.getExponent
Un double este stocat ca mantisă × 2exponent, cu mantisa între 1 și 2. Math.getExponent(d) returnează acest exponent: pentru 8.0 este 3 (8 = 1 × 23), pentru 10.0 tot 3 (10 = 1.25 × 23). Altfel spus, este partea întreagă a lui log2|d|.
Math.scalb(d, n) calculează d × 2n schimbând doar exponentul, deci rezultatul este exact (fără rotunjire), cât timp nu iese din domeniul lui double. Ambele metode sunt folosite în cod numeric de nivel jos.
Parametri
| Parametru | Descriere |
|---|---|
d |
Numărul. |
n |
Pentru scalb: puterea lui 2 cu care se înmulțește. |
Ce returnează
getExponent: un int. scalb: un double.
Exemple
Exemplul 1: Exponentul binar al unor numere
public class Main {
public static void main(String[] args) {
double[] valori = {1, 8, 10, 0.5, 1000};
for (double v : valori) {
System.out.println(v + " -> " + Math.getExponent(v));
}
}
}
Rezultat
1.0 -> 0
8.0 -> 3
10.0 -> 3
0.5 -> -1
1000.0 -> 9
Exemplul 2: Înmulțire cu puteri ale lui 2
3 × 24 = 48 și 3 × 2-1 = 1.5. 21024 depășește cel mai mare double, deci rezultatul este Infinity.
public class Main {
public static void main(String[] args) {
System.out.println(Math.scalb(3.0, 4));
System.out.println(Math.scalb(3.0, -1));
System.out.println(Math.scalb(1.0, 1024));
}
}
Rezultat
48.0
1.5
Infinity
Greșeli frecvente
- Crezi că
getExponentdă exponentul zecimal (din notația 1e3): returnează exponentul în baza 2.
Comenzi înrudite
Math.nextUp: Lucrează cu „pașii” dintre numerele double: valoarea imediat următoare sau anterioară și mărimea pasului (ulp).Math.log: log() dă logaritmul natural (baza e), log10() logaritmul în baza 10, iar log1p(x) calculează precis ln(1 + x).Math.pow: Ridică un număr la o putere și returnează rezultatul ca double; exponentul poate fi și negativ sau cu zecimale.