1 / 7
Mar 2017

Prosiłbym o wyjaśnienie skąd dla 1 reprezentacja szesnastkowa w postaci: 3f 80 0 0 ??
Rozumiem, że wynika to z reprezentacji binarnej w postaci 0011 1111 1000 0000 0000 0000 0000 0000
niestety mi wychodzi 0111 1111 0000 0000 0000 0000 0000 0000.
Jak uzyskać drugie zero w pierwszym członie(0011 a nie 0111)? Pierwsze zero rozumiem to znak dalej exponanta dla 127 czyli 1111111 więc skąd zapis 0011??
Pozostałe testy dla -345, 125.123 i 0 obliczyłem poprawnie według jednego algorytmu, niestety algorytm ten nie sprawdza się dla 1 i -1...

  • created

    Mar '17
  • last reply

    May '17
  • 6

    replies

  • 711

    views

  • 4

    users

  • 1

    link

14 days later

W tym zadaniu chodzi o wczytanie liczby zmiennoprzecinkowej i tej pamięci jaką zajmuje ta zmienna trzeba wypisać w postaci heksagonalnej ( szesnastkowym systemie liczbowym ) .

Najlepiej zrobić to poprzez rzutowanie - w pascalu jest coś takiego jak deklarowanie zmiennej jako absolute wtedy taka zmienna zajmuje ( wskazuje ) na miejsce zajmowane przez inną zmienną .

Var InputFloat : Float;
FloatToArrar : Array[0..3] of Byte absolute InputFloat;

Jest też coś takiego jak rekord z wariantami .

Type TDane = Record
case Byte of
0: ( InputFloat : Float );
1:( FloatToArray : Array[ 0..3 ] of Byte )
end;
Var Dane : TDane;

Po wczytaniu z wejscia do zmiennej Dane masz od razu dostęp do reprezentacji bitowej liczby .

Jest też jeszcze zwykłe rzutowanie przez wskaźnik - ale to stosują tylko zaawansowani koderzy .

Generalnie algorytm postępowania w zadaniu wygląda tak :
1. Wczytaj dane do Float;
2. Zrzutuj Float na typ Bajtowy ( najwygodniej )
3. Przekonwertuj każdy Bajt na Hex.
4. Przekonwertuj każdy Hex na Char
5. Wypisz Char-y z odstępami .

@loginus
To jest tylko obejście :wink:, więc moim zdaniem, nie powinieneś proponować, czy podpowiadać takiego rozwiązania.

Jak obejście nie odpowiada pozostaje studiowanie Wiki -https://pl.m.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa

Tu jest kalkulator online - https://www.h-schmidt.net/FloatConverter/IEEE754.html4

Pierwsze zero to znak liczby , potem osiem kolejnych bitów to zakodowana potęga do której podnosimy podstawę - czyli liczbę dwa . Aby z liczby dwa uzyskać jeden trzeba podnieść ją do zerowej potęgi . Teraz wystarczy zapisać zero + 127 .
127 daje w zapisie binarnym 01111111. Co z pierwszym zerem daje dwa zera na początku .
Gdyby po testował z moim obejsciem raz dwa by zorientował się gdzie robi błąd w obliczeniach .

!? Niby w jaki sposób?

@marcin_orlik nie pytał, w jaki sposób, łatwo i przyjemnie rozwiązać zadanie, tylko o konkretny błąd, który wyjaśniłeś w swoim drugim poście ....

I jeszcze jedno, nie wiadomo, czy pytający używa paskala, i czy umiałby to napisać [przepisać] w swoim języku?

PS
Ja sam też użyłem identycznego[podobnego] obejścia ale w c++ i wcale nie zachęcam do tej metody. Jeżeli ktoś chce zrobić to zadanie "poprawnie", zgodnie z intencją autora zadania, to należy tylko przyklasnąć.

Wielkie dzięki za podpowiedź bo już traciłem nadzieję że ktokolwiek się zlituje :wink: Teraz już mi się wszystko składa w całość.

26 days later

Witam
Mam pytanie odnośnie mojego algorytmu. Proszę mnie nie karcić za wygląd kodu. Wiem że się powtarzają niepotrzebne linie kodu, ale moim celem było zrozumienie jak to się liczy. Czy ten kod pomimo niedoskonałości dobrze reprezentuje liczby float?. Następny krokiem będzie refaktoryzacja kodu.

def printfloat(float):
    z = float
    dot=''
    dot_end=[]
    xx=''
    y=''
    iii=0
    menn=''
    wynik=''
    poj=[]
    for i in z:
    bity = bin(int(i))
    item = bity.index('b')+1
    x = xx.join(bity[item:])        
    dl = len(x)
    E = 127 +(dl-1)
    bit_int = bin(E)
    item_podst = bit_int.index('b')+1
    podstawa_y = y.join(bit_int[item_podst:])
    zera = len(podstawa_y)
    zm_i = i

    if 0 < i < 1:
        licznik = 0
        while zm_i < 1:
            zm_i = zm_i * 2
            licznik += 1

        E = 127 - licznik
        bit_int = bin(E)
        item_podst = bit_int.index('b')+1
        podstawa_y = y.join(bit_int[item_podst:])
        zera = len(podstawa_y)

        if zm_i // 1 > 0:
           ii = zm_i // 1
           iii = zm_i - ii
 
        kk = iii
        while kk  != int(kk): 
            kk = kk * 2
            kkk = kk // 1
            kk = kk - kkk
            dot_end.append(str(int(kkk))) 

        dot = dot.join(dot_end[:])
                    
        if zera < 8:
            men =  menn.join('00'+podstawa_y+x[1:]+dot)
            dl_men = len(men)

            if dl_men % 4 > 0:
               r = 4 - dl_men % 4 
               men =  menn.join('00'+podstawa_y+x[1:]+dot+r*'0')
                
        else:
            men =  menn.join('0'+podstawa_y+x[1:]+dot)
            dl_men = len(men)
            if dl_men % 4 > 0:
               r = 4 - dl_men % 4 
               men =  menn.join('00'+podstawa_y+x[1:]+dot+r*'0')                   
        system_hex = hex(int(men,2))
        men=''

    elif -1 < i and i < 0:
        licznik = 0
        zm_i = zm_i *(-1)
        while zm_i < 1:
            zm_i = zm_i * 2
            licznik += 1
        E = 127 - licznik
        bit_int = bin(E) 
        item_podst = bit_int.index('b')+1
        podstawa_y = y.join(bit_int[item_podst:])
        zera = len(podstawa_y)

        if zm_i // 1 > 0:
           ii = zm_i // 1
           iii = zm_i - ii

        kk = iii
        while kk  != int(kk): 
            kk = kk * 2
            kkk = kk // 1
            kk = kk - kkk
            dot_end.append(str(int(kkk))) 
        dot = dot.join(dot_end[:])
                    
        if zera < 8:
            men =  menn.join('10'+podstawa_y+x[1:]+dot)
            dl_men = len(men)
            if dl_men % 4 > 0:
               r = 4 - dl_men % 4 
               men =  menn.join('10'+podstawa_y+x[1:]+dot+r*'0')
                
        else:
            men =  menn.join('1'+podstawa_y+x[1:]+dot)
            dl_men = len(men)
            if dl_men % 4 > 0:
               r = 4 - dl_men % 4 
               men =  menn.join('1'+podstawa_y+x[1:]+dot+r*'0')                   
        system_hex = hex(int(men,2))
        men=''
    elif i % 1 == 0 and i < 0:

        if zera < 8:
            men =  menn.join('10'+podstawa_y+x[1:])
            dl_men = len(men) 
            if dl_men % 4 > 0:
               r = 4 - dl_men % 4 
               men =  menn.join('10'+podstawa_y+x[1:]+r*'0')
        else:
            men =  menn.join('0'+podstawa_y+x[1:])
            dl_men = len(men)
            if dl_men % 4 > 0:     
               r = 4 - dl_men % 4 
               men =  menn.join('1'+podstawa_y+x[1:]+r*'0')                   
        system_hex = hex(int(men,2))
        men=''
        elif i > 0 and i // 1 == i:
            if zera < 8:
                men =  menn.join('00'+podstawa_y+x[1:])
                dl_men = len(men)
                if dl_men % 4 > 0:
                   r = 4 - dl_men % 4 
                   men =  menn.join('00'+podstawa_y+x[1:]+r*'0')
            else:
                men =  menn.join('0'+podstawa_y+x[1:])
                dl_men = len(men)
                if dl_men % 4 > 0:
                   r = 4 - dl_men % 4 
                   men =  menn.join('00'+podstawa_y+x[1:]+r*'0')                   
            system_hex = hex(int(men,2))
            men=''
        elif i % 2 > 0 and i > 0:
            if i // 1 > 0:
           ii = i // 1
           iii = i - ii

        kk = iii
        while kk  != int(kk): 
            kk = kk * 2
            kkk = kk // 1
            kk = kk - kkk
            dot_end.append(str(int(kkk))) 
        dot = dot.join(dot_end[:])
                    
        if zera < 8:
            men =  menn.join('00'+podstawa_y+x[1:]+dot)
            dl_men = len(men)
            if dl_men % 4 > 0:
               r = 4 - dl_men % 4 
               men =  menn.join('00'+podstawa_y+x[1:]+dot+r*'0')
                
        else:
            men =  menn.join('0'+podstawa_y+x[1:]+dot)
            dl_men = len(men)
            if dl_men % 4 > 0:
               r = 4 - dl_men % 4 
               men =  menn.join('00'+podstawa_y+x[1:]+dot+r*'0')                   
        system_hex = hex(int(men,2))
        men=''
    elif i % 2 > 0 and i < 0 :
        if i*(-1) // 1 > 0:
           ii = i*(-1) // 1
           iii = i*(-1) - ii

        kk = iii
        while kk  != int(kk): 
            kk = kk * 2
            kkk = kk // 1
            kk = kk - kkk
            dot_end.append(str(int(kkk))) 
        dot = dot.join(dot_end[:])
                 
        if zera < 8:
            men =  menn.join('10'+podstawa_y+x[1:]+dot)
            dl_men = len(men)
            if dl_men % 4 > 0:
               r = 4 - dl_men % 4 
               men =  menn.join('10'+podstawa_y+x[1:]+dot+r*'0')
                
        else:
            men =  menn.join('1'+podstawa_y+x[1:]+dot)
            dl_men = len(men)
            if dl_men % 4 > 0:
               r = 4 - dl_men % 4 
               men =  menn.join('1'+podstawa_y+x[1:]+dot+r*'0')                   
        system_hex = hex(int(men,2))
        men=''
    elif i == 0:     
        system_hex ='0x0' 

    dot=''
    dot_end=[]
    item_hex = system_hex.index('x')+1
    dl_hex = len(system_hex[item_hex:])
    #print(dl_hex)
    if dl_hex > 8:
        #print('+++++++++')
        end_hex_1 = dl_hex - 8
        end_hex = dl_hex - end_hex_1+2
        wynik = wynik.join(system_hex[item_hex:end_hex])
        poj.append(wynik)
    elif dl_hex < 8:
        wynik = wynik.join(system_hex[item_hex:])
        poj.append(wynik)
    #print(poj)
    
    #print('**********')
    
    wynik=''
if dl_hex < 8 or dl_hex > 8 :
    #print('-----------')
    for hh in poj:
        u = 0
        dl_h = len(hh)
        for jj in range(dl_h):         
            print(hh[jj],end='')
            if u%2>0:
                print(end=' ')
            if jj==dl_h-1:
                if dl_h == 1 and hh =='0':
                    print(' 0 0 0',end=' ')

                elif dl_h == 1 or dl_h == 2:
                    for n in range(5-dl_h):
                        print('0',end=' ')
                elif dl_h == 3 or dl_h == 4:
                        for n in range(6-dl_h):
                            print('0',end=' ')
                elif dl_h == 5 or dl_h == 6:
                        for n in range(7-dl_h):
                            print('0',end=' ')
                elif dl_h == 7 :
                        for n in range(8-dl_h):
                            print('0',end=' ') 
            u+=1
        print()    
    wynik=''
lab = []   
tab = []
test = int(input())
out = 0
while test > out:
    t = input()
    tab.append(t.strip(' '))
    for j in tab:
        tab[out] = float(tab[out])
    out += 1
printfloat(tab)