Brak błędu w połączeniu float i long?

0

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?2021-07-19_10-51-33-99bd045d658901d3509f3d5e6e423749.jpeg

2

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)
0

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.

2

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

0

@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.

0

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ę.

0

Dziękuję bardzo wszystkim za odpowiedzi. Rozumiem już mój błąd myślowy ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1