W pewnym momencie rozwoju technologii obliczeniowej stało się jasne, że jednostki centralne potrzebują urządzeń sprzętowych do przetwarzania liczb zmiennoprzecinkowych. Obecnie wszystkie architektury komputerowe mogą efektywnie współpracować z takimi liczbami. Oczywiście w językach programowania również nie można obejść się bez odpowiednich typów danych. W Javie istnieją dwa typy danych zmiennoprzecinkowych: float i double. Słowo kluczowe Java Float definiuje liczbę rzeczywistą zajmującą 32 bity w pamięci. O takich liczbach porozmawiamy w tym artykule.
Zatem słowo kluczowe Float oznacza liczbę, wartość o pojedynczej precyzji, która zajmuje 32 bity lub 4 bajty w pamięci. Na niektórych procesorach praca z takimi liczbami jest szybsza i, jak już wspomniano, zajmują one mniej miejsca w porównaniu z liczbami o podwójnej precyzji. Nie da się jednak jednoznacznie powiedzieć o szybkości. Załóżmy, że niektóre nowoczesne procesory przetwarzają liczby dokładnie o podwójnej precyzji szybciej.
Liczb zmiennoprzecinkowych. W jaki sposób liczby rzeczywiste są przechowywane w komputerze?
Do przechowywania liczb rzeczywistych w pamięci komputera przydzielana jest określona liczba bitów. Liczbę rzeczywistą przechowuje się jako znak (plus lub minus), modliszkę i wykładnik. Czym jest mantysa i wykładnik, najlepiej wyjaśnić na przykładzie. Przybliżona masa księżyca wynosi 7* 1022. Tutaj 7 to modliszka, w 22 wykładnik. Wyświetlając na ekranie duże lub odwrotnie, bardzo małe liczby, możesz zobaczyć wpis taki jak 7E22. To jest liczba zmiennoprzecinkowa, 7 to modliszka, a 22 to wykładnik lub potęga 10. Ten zapis nazywa się notacją wykładniczą.Słowo kluczowe Java float i podwójne słowo kluczowe Java
Wartości zmiennoprzecinkowe (liczby zmiennoprzecinkowe lub liczby rzeczywiste) w Javie są reprezentowane przez typy float i double . To właśnie te słowa kluczowe służą do przechowywania wartości do określonego znaku po przecinku. double to liczby o podwójnej precyzji, jak najbardziej zbliżone do wartości podanych lub uzyskanych w wyniku obliczeń. Java Double służy do wszelkich obliczeń matematycznych (pierwiastek kwadratowy, sinus, cosinus, ..), a także do wszelkich obliczeń, w których ważna jest pewna dokładność. Typ danych float jest używany w przypadku mniej precyzyjnego typu zmiennoprzecinkowego. Jest używany bardzo rzadko w celu oszczędzania pamięci. Poniżej znajduje się tabela z głównymi informacjami na temat float i double oraz ich różnicami.Platforma | Podwójnie | |
---|---|---|
Główny | Float to wartość o pojedynczej precyzji | Jest to wartość o podwójnej precyzji |
Rozmiar domyślny | 4 bajty (32 bity) | 8 bajtów (64 bity) |
Domyślna wartość | 0,0 f | 0,0 |
Zakres | od 1.4e–045 do 3.4e+038 | od 4,9e–324 do 1,8e+308 |
Do czego to służy | Aby zaoszczędzić pamięć | stosunkowo dokładnie pracować z liczbami ułamkowymi |
Float Java i podwójna deklaracja
Możesz zadeklarować liczbę typu double w taki sam sposób, jak liczby innych typów:double myDouble = 2.7;
Jeśli jednak w ten sposób reprezentujesz liczbę zmiennoprzecinkową, kompilator będzie wymagał zmiany typu liczby na double. Oto niepoprawny przykład zmiennej float :
public class FloatExample {
public static void main(String[] args) {
//double and float variables
double myDouble = 2.7;
float myFloat = 3.14;
}
}
Oto, co się stanie, jeśli uruchomisz ten program:
Error:(4, 25) java: incompatible types: possible lossy conversion from double to float
Faktem jest, że używanie liczb zmiennoprzecinkowych jest niepożądane i należy to robić wyłącznie w celu zaoszczędzenia pamięci. Wszystkie rzeczywiste liczby ułamkowe w Javie mają domyślnie wartość Double i składnia języka również to podkreśla. Jeśli naprawdę chcesz pracować z typem zmiennoprzecinkowym, musisz określić go jawnie za pomocą f kończącego liczbę.
public class FloatExample {
public static void main(String[] args) {
//double and float variables
double myDouble = 2.7;
float myFloat = 3.14f;
}
}
Nawiasem mówiąc, liczby zmiennoprzecinkowe i podwójne można zapisać w formie wykładniczej.
float myFloat2 = 2E22f;
double myDouble2 = 3e10;
Jeśli użyjesz wystarczająco dużych liczb w ich „normalnej” reprezentacji, Java wyświetli je natychmiast w formie wykładniczej. Weźmy przykład:
public class FloatExample {
public static void main(String[] args) {
//float variables
float myFloatNumber1=2182818284590.45f;
float myFloatNumber2=19822612787260.141592181f;
System.out.println("myFloatNumber1 = " + myFloatNumber1);
System.out.println("myFloatNumber2 = " + myFloatNumber2);
System.out.println("myFloatNumber1 + myFloatNumber2 = " + myFloatNumber1 + myFloatNumber2);
}
}
Efekt pracy tego programu znajduje się tutaj:
mójFloatNumber1 = 2,1828183E12 mójFloatNumber2 = 1,98226121E13 mójFloatNumber1 + mójFloatNumber2 = 2,1828183E121.98226121E13
Przykład specjalnych liczb zmiennoprzecinkowych i podwójnych
W języku Java istnieją trzy specjalne liczby zmiennoprzecinkowe, które służą do wskazywania przepełnień i błędów. Tutaj są:-
Dodatnia nieskończoność jest wynikiem podzielenia liczby dodatniej przez 0. Reprezentowana przez stałe Double.POSITIVE_INFINITY i Float.POSITIVE_INFINITY .
-
Ujemna nieskończoność jest wynikiem podzielenia liczby ujemnej przez 0. Reprezentowana przez stałe Double.NEGATIVE_INFINITY i Float.NEGATIVE_INFINITY .
-
NaN (nie liczba) reprezentuje obliczenie 0/0 lub pierwiastek kwadratowy z liczby ujemnej. Reprezentowane przez stałe Double.NaN i Float.NAN .
public class FloatExample {
public static void main(String[] args) {
int myInt = 1;
float zero = 0.0f;
double negZero = -0.0;
double negativeInfinity = Double.NEGATIVE_INFINITY;
double positiveInfinity = Float.POSITIVE_INFINITY;
System.out.println(myInt / zero);
System.out.println(myInt / negZero);
System.out.println(zero == negZero);
System.out.println(negativeInfinity * 0);
System.out.println(positiveInfinity+negativeInfinity);
}
}
Wynik to:
Nieskończoność -Nieskończoność prawdziwa NaN NaN
Czy podwójna precyzja jest wystarczająca?
Tak naprawdę pomimo podwójnej precyzji typu Double , używanie liczb zmiennoprzecinkowych np. w obliczeniach finansowych nie jest najlepszym pomysłem, gdyż błędy zaokrągleń są niedopuszczalne. Spróbuj więc wyświetlić dane wyjściowe następującego programu na ekranie.public class FloatExample {
public static void main(String[] args) {
System.out. println( "2.0 - 1.1 = " + (2.0 - 1.1));
}
}
Otrzymasz następujący wynik:
2,0 - 1,1 = 0,8999999999999999
Logiczne byłoby założenie, że wynik wyniesie 0,9. Jednak takie błędy są dość powszechne i są związane z wewnętrzną binarną reprezentacją liczb. Nie możemy na przykład przedstawić dokładnej wartości ⅓ jako ułamka dziesiętnego; oczywiście podobne ograniczenia obowiązują w systemie binarnym. Jeśli zadanie wymaga wyeliminowania błędów zaokrągleń, Java posiada do tego klasę BigDecimal .
GO TO FULL VERSION