Cześć,
niedawno rozpocząłem nauką Javy i podczas ćwiczeń napotkałem nierozumiałą rzecz.
Zastanawiam się dlaczego nie pojawia się błąd przy dzieleniu, gdzie wynik dzielenia ma być zmienną typu float, a liczba którą dzielę zmienną typu long? Long jest większy, więc dlaczego nie pokazuje się błąd skoro nie mogło nastąpić konwertowanie?
Spróbuję conieco rozwikłać
- wygląda, jakbyś w błędny sposób rozumiał obliczenie A, którego wynik będzie przypisany do B. To nie są rzeczywistości uwzględniane na tym samym poziomie, w tej samej chcili. Decyzje o konwersji typów danych biorących udział w obliczeniu to jedno, a DRUGIE I ODERWANE jest przypisanie wyniku do czegoś.
Inaczej mówiąc dla doboru typów przejściowych w czasie ewaluacji (obliczania) z prawej strony nie ma znaczenia, do czego zostanie przypisany z lewej - zasadą większość języków (ale nie będę przysięgał) jest, że o ile gdzie przelatuje float, to w wyrażeniu na krótko będzie skonwertowany do double. Dałbym 90% szans, że wyrażenie z przykładu przez chwilę jest liczone na double.
-
long jest większy
- co chciałeś powiedzieć? Że tu i teraz liczba w longu jest większa (nie ma to znaczenia dla doboru typów), czy że ma większą dokładność? Słowa sa ważne -
skoro nie mogło nastąpić konwertowanie
jakim tokiem myślenia to Ci wyszło ? - tytuł
brak błędów w POŁĄCZENIU
sam się skrzywdziłeś użyciem rozmytego, nieprecyzyjnego słowa "połączenie" (gdzieś tam w matematyce jest chyba takie słowo, ale nie tutaj)
Pisząc, że long jest większy od float chodziło mi o to, że long ma 64bity a float 32 bity. Z tego czego dowiedziałem się odnośnie operacji np. dzielenia, to że konwersja niejawna może nastąpić z większego na mniejsze, a nie na odwrót.
W Javie wynik operacji long/float
jest typu float
(a może double, nie pamiętam i tak nikt nie używa floatów tylko wszyscy double).
Zamień wzrost * wzrost
na long i zobacz co się stanie
@Vuk0 nie rozumiesz jak działają liczby zmiennoprzecinkowe. Twierdzisz ze long jest większy
a ja twierdzę ze to bzdura. Tak, long ma więcej bitów, ale to o niczym nie świadczy. Float/Double kodują liczby w bardzo szczególny sposób, dlatego są w stanie przechować zarówno bardzo małe, jak i bardzo duże wartości, przy ograniczonej precyzji. Twój 64 bitowy long może przechować wartość 2**64
czyli 18446744073709551616
podczas gdy 32 bitowy float ~3.4*10^38
czyli 339999999999999996123846586046231871488
czyli jakieś 2**64
razy więcej.
W takim ujęciu float jest w stanie przechowywać dużo większe liczby. Trik polega na tym, że float będzie "gubić" cyfry tzn np. jest w stanie mieć wartość 123456 i 123458 ale już 1234567 nie, więc dla tej konkretnej wartości ta ostatnia cyfra będzie przekłamana.
Kol użył słowa "typ jest większy" ... szukałem w googlu, jakie DOKŁADNIE słowo jest w oficjalnej dokumentacji co do propagacji typów. Nie znalazłem, zdrowy rozsadek mówi, ze nie "dokładniejszy" a o większym zakresie.
Znalazłem w tym przeglądzie googla, ze WIELE popularnych materiałów słowa dobiera mniej dokładnie, i można przyjąć złą inspirację.
Dziękuję bardzo wszystkim za odpowiedzi. Rozumiem już mój błąd myślowy ;)