1 / 24
Nov 2015

Cześć, mam pytanie do tego zadania. Otóż czy ktoś mógłby mi wytłumaczyć, w jaki sposób liczba typu float jest przeliczana na taką reprezentację szesnastkową, jaka jest podana na wyjściu programu ? Weźmy przykład:

liczba 18:

dla mnie w szesnastkowym byłoby to po prostu (12)_16, natomiast zgodnie z kalkulatorem to 41 80 00 00...rozumiem, że to robi się jakoś na poziomie bitów... domyślam się, że jest to dziecinnie proste... czy mógłby mi ktoś to "rozpisać ręcznie" ?

  • created

    Nov '15
  • last reply

    Aug '19
  • 23

    replies

  • 3.4k

    views

  • 10

    users

  • 1

    like

  • 5

    links

Kolego to zadanie lepiej zrobić nie bawiąc się w żadne mantysy. Oczywiście fajniusio poznać co to ten float ale jak już napiszesz to z tymi wszystkimi mantysami etc i nie przyjmie to zapomnij o tym sposobie rozwiązania i zastanów się czy może nie dałoby się jakoś niecnie na adresie podziałać. Bity są te same prawda?

Pozdrawiam. Mam nadzieję, że za bardzo nie podpowiedziałem.

Nie zgadzam się:
1. Sposób jaki proponujesz zadziała tylko w kilku "wybranych" językach [np.: assembler, c, c++, jeszcze jakiś?]
2. Warto poznać "poprawny" sposób i nigdy go nie zapominać.

Więc na pewno nie: lepiej, ale np. tak: to zadanie można zrobić też inaczej ...

W tym zadaniu nie ma metody " lepszej" ani "gorszej". Istnieje tylko "jedynie słuszna". Po prostu trzeba "podejrzeć" co ta liczba "ma w środku"

Przedstawiłeś właśnie jedną z metod. Druga metoda, to trzeba bez podglądania obliczyć to co jest w środku. Chyba, że piszesz, ale nie zdajesz sobie sprawy, że istnieje metoda "niesłuszna" - metoda podglądania?

PS
Tak naprawdę, to znam co najmniej trzy metody. Jedna, to ta "jedyna słuszna" -> samodzielne obliczenie [przez własny program] oraz dwie różne "niesłuszne" metody podglądania [działające w C/C++].

Samo policzenie reprezentacji choć możliwe jest dość kłopotliwe dla początkującego programisty.Samo "podglądanie" można zrealizować za pomocą unii,wskaźników lub poprzez bezpośrednie rzutowanie (korzystanie z adresów bez zmiennych wskaźnikowych)... Jeszcze co mi przychodzi do głowy to korzystając z wstawek w asemblerze zrzucenie na stos liczby float i pobranie tablicy char...

NIe tylko. wink
Program wczytując zmienną typu float, [np cin, lub scanf] uruchamia odpowiednią procedurę/algorytm i robi to co trzeba zrobić w zadaniu - zapisuje sobie tą liczbę właśnie w takiej, potrzebnej postaci. Ale czy autorowi zadania @kuszi o to chodziło? O podglądnięcie i wypisaniu tego co już jest zrobione czy o samodzielne powtórzenie całego tego algorytmu i wypisaniu bajtów w systemie szesnastkowym?. Gdyby wczytywanie było wymuszone jako zmienna typu string, byłoby to całkowicie jasne. W takiej sytuacji sprytni i leniwi programiści skorzystają z podglądnięcia, ambitniejsi .... a także w wypadku innych języków sami napiszą pełny algorytm zamiany, bez "podglądania".

PS
Ja niestety jestem z tych leniwych ... skorzystałem z unii, ale obiecuję poprawę, zmobilizuję się i napiszę kiedyś jak przystało.

Ja akurat skorzystałem z rzutowania.... Przeraziły mnie tak nie do końca określone zasady zaokrąglania czyli konwersji z 10 na 2...Można popełnić dużo drobnych błędów....

10 days later
1 year later

Witam pisze program który liczbę zmienno przecinkowa zamienia na kod szesnastkowy. Ale mam pewien problem z obliczenie części ułamkowej na kod binarny. W internecie znalazłem kilka filmów które mi pomogły z tym zagadnieniem (bo wcześniej nie wiedziałem jak ugryź temat ) i w tym filmiku był przykład 5.2 i przedstawienie liczby 0.2 w binarce to 0011 i tak w nieskończoność (odsyłam do filmu https://www.youtube.com/watch?v=n-XozGu1viM20) ale u mnie program jak mnoży 0.4 * 2.0 to mam jakieś 0.7999999 a nie 0.8 i tak dalej i w pewnym miejscy program się kończy bo otrzymuje 1 a nie powinien. Wynik poprawny to 00110011001100110011001 a u mnie jest 00110011001100110011.

tu jest kod http://ideone.com/CLfLW729

ale mam dziwne wyniki:
4
5.2
czesc calkowita5 czesc ulamkowa 0.2
mod 1
mod 0
mod 1
dana liczba:
dana liczba: 1
dana liczba: 0
dana liczba: 1
liczba: 5 w binarnym to: 101
liczba: 5 w binarnym to: 101.
decimal: 0.4
binarka:
binarka: 0
decimal: 0.8
binarka: 0
binarka: 00
decimal: 1.6
binarka: 00
binarka: 001
decimal: 1.2
binarka: 001
binarka: 0011
decimal: 0.4
binarka: 0011
binarka: 00110
decimal: 0.8
binarka: 00110
binarka: 001100
decimal: 1.6
binarka: 001100
binarka: 0011001
decimal: 1.2
binarka: 0011001
binarka: 00110011
decimal: 0.3999
binarka: 00110011
binarka: 001100110
decimal: 0.7998
binarka: 001100110
binarka: 0011001100
decimal: 1.6
binarka: 0011001100
binarka: 00110011001
decimal: 1.199
binarka: 00110011001
binarka: 001100110011
decimal: 0.3984
binarka: 001100110011
binarka: 0011001100110
decimal: 0.7969
binarka: 0011001100110
binarka: 00110011001100
decimal: 1.594
binarka: 00110011001100
binarka: 001100110011001
decimal: 1.188
binarka: 001100110011001
binarka: 0011001100110011
decimal: 0.375
binarka: 0011001100110011
binarka: 00110011001100110
decimal: 0.75
binarka: 00110011001100110
binarka: 001100110011001100
decimal: 1.5
binarka: 001100110011001100
binarka: 0011001100110011001
decimal: 1
binarka: 0011001100110011001
binarka: 00110011001100110011

Wiem ze jest celi round ale to nie działa nawet jak dziele przez 10 100 itd bo czasami mam np 0.332 a czasami 1.4522
Czy jest jakiś sposób na floaty?

9 months later

Cześć. Przy sprawdzaniu wyskakuje mi błąd. Już brak mi pomysłów ;( . Czy ktoś mógłby rzucić okiem?
Done.

Nie wczytywałem się w kod, ale dla pewności: zdajesz sobie sprawę, że wypisujesz dodatkowo formę binarną? Wiec jeśli wysyłasz ten sam kod oczywiście będziesz miał WA.

Spróbuj tak zrobić aby nie mieć wiodących zer w odpowiedzi, np dla testu:

4
0.01
0.02
0.03
0.04

Jak nie to to poszukamy dalej.

Chodzi o to, że np. dla liczby 6E-34 wychodzi 0847625b, a program ma wypisać 8 47 62 b5?

Out dla podanego przeze mnie testu:

3c 23 d7 a 
3c a3 d7 a 
3c f5 c2 8f 
3d 23 d7 a
2 months later

Hej, ciągle WA, odpowiedzi takie jak w kalkulatorach.
Czy może chodzić o za długi kod albo o czas wykonywania? Z góry dzięki za pomoc.