Skocz do zawartości

Rekomendowane odpowiedzi

Napisano

Witam dostałem zadanko do wyliczenia ale nie umiem go wyliczyc

 

Jaką wartość zapisano w komórce, jeżeli jest to liczba FPU o schemacie: 1bit znaku. 5 bitów cechy U2, 10 bitów mantysy znormalizowanej? 0110010101010111

  • Odpowiedzi 20
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

Napisano

Według mnie, jeśli się nie walnąłem, jest to 0,342e(-7).

 

chveti - tak nie można przeliczać. To nie jest taka "normalna" liczba binarna.

 

[edit]

Albo 0,343e-7 ;)

Napisano

Masz liczbę 0110010101010111.

 

Najsarszy bit to bit znaku (0), dalej - 5 bitów cechy (11001) i 10 bitów to matysa znormalizowana (0101010111).

 

Bit znaku, czyli gdy jest 0, jest "+", gdzy jest 1 - "-".

 

Cecha jest w U2, więc to jest (2^x oznacza 2 do potęgi x), czytając ją od końca:

1 * 2^0 + 0 * 2^1 + 0 * 2^2 + 1 * 2^3 + (-1) * 2^4 czyli -7.

 

Mantysa ma 10 cyfr, więc podobnie, tyle że bez U2:

2^0 + 2^1 + 2^2 + 2^4 + 2^6 + 2^8 = 1 + 2 + 4 + 16 + 64 + 256 = 343.

Ponieważ mantysa znormalizowana, oznacza to 0.343.

 

Idea jest taka, że liczba w takim systemie to mantysa * 10^cecha, więc ostatecznie:

0.343 * 10^(-7).

 

Chociaż w sumie to chyba powinno być 0.343 * 2^(-7), ponieważ jesteśmy w systemie binarnym.

Zresztą nie wiem... Najlepiej dopytaj się kogoś.

Napisano

Ok ale nie rozumiem dlaczego cyfr w cesze jest 5 tak 11001 to dlaczego w działaniu jest 6 działań w tym jedno z -1

I ponizej w mantysie jest działąń tylko 6 a ona przeciez składa sie z 10 cyfr

Napisano

Liczbę w dowolnym systemie zpisujemy przy pomocy znaków (u nas są to cyfry arabskie 123456789. Równie dobrze mogłyby to być gwiazdki, kreseczki, kropeczki, krzaczki etc. ;) ):

 

a b c d e f g h i j k

 

System, którego używamy jest sytemem pozycyjnym, więc znaczenie każdego znaku/cyfry zależy od pozycji na jakiej się znajduje. Pozycje numerujemy od zera od prawej strony.

I tak w powyższym przykładzie: "k" jest na pozycji 0, "j" na pozycji 1 itd.

 

Wartość liczbową takiego wyrażenia oblicza się, jak następuje:

k*base^0 + j * base^1 + i * base^2 + h * base^3 + ... + b * base^9 + a * base^10

 

base to podstawa systemu, tym wypadku jest to 2, gdyż jest sytem dwójkowy, w trójkowym byłoby 3, w dziesiętnym byłoby 10, w szesnastkowym 16.

 

Ponieważ w systemie dwójkowym występują tylko dwie cyfry - 0 i 1 odpowiednie potęgi 2 mnoży się albo przez jeden, albo przez zero...

 

Liczbę 10011

Można zapisać jako 1 * 2^0 + 1 * 2^1 + 0 * 2^2 + 0 * 2^3 + 1 * 2^4.

 

Tak samo jest w poście wyżej, tylko po prostu tam pominąłem zera, bo zero pomnożone przez dowolną liczbę jest zero ;)

 

Przykład w systemie dziesiętnym (trochę masło maślane, ale chyba jasne):

Jest sobie liczba 496 zapisana w systemie dziesiętnym.

Jej wartość można wyliczyć rozkładając ją w wielomian, jak powyżej:

 

6 * 10^0 + 9 * 10^1 + 4 * 10^2 = 6*1 + 9*10 + 4*100 = 496.

 

Ta sama liczba 496 zapisana w systemie czternastkowym, miałaby wartość:

 

6 * 14^0 + 9 * 14^1 + 4 * 14^2 = 6 + 126 + 4*196 = 132 + 784 = 816 w systemie dziesiętnym.

 

 

 

W czesze powyżej jest -1, gdyż jest to kod uzupełnieniowy U2, a taka jest jego "specyfikacja", że najstarszy bit na wartość ujemną, czyli jest przemnożony przez -1. Ot, ktoś mądry wymyślił taki sposób na zapisywanie liczb ujemnych.

Napisano

Może i prymitywne, ale skoro jesteśmy przy temacie, to może się przydać do sprawdzenia poprawności zamiany ;) :

 

Zamiana z dziesiętnego na dwójkowy:

#include 
#include 

void sys2 (int x);

main()
{
char tablica[20];
int x;
int i = 0;

cout cin >> x;

  for (x; x > 0; i++) //wpisywanie wartosci do tablicy
  {
     if (x % 2 == 0)
        {
        tablica[i] = '0';
        x /= 2;
        }
     else
         {
         tablica[i] = '1';
         x = (x-1)/2;
         }
  }
  cout    for (i -= 1; i>= 0; i--)
      cout    cout 
system("pause");
}

 

Z dziesiętnego na szesnastkowy:

#include 
#include 

main ()
{
int reszta, x, dziel, odejm;

cout cin >> x;

for (x; x>0;(odejm > 0)? x -= odejm: x/= 16 )
   {
   reszta = x % 16;
   dziel = x/16;
   switch ((x>=16)?dziel:reszta)
          {
          case (10) :
               cout                 break;
          case (11) :
               cout                 break;
          case (12) :
               cout                 break;
          case (13) :
               cout                 break;
          case (14) :
               cout                 break;
          case (15) :
               cout            case (16) :
               cout                 break;
          default:
               cout =16)?dziel:reszta);
               break;
          }
   odejm = dziel * 16;
   }

cout system ("pause");
}

do skompilowania w dowolnym kompilatorze c++

Napisano

To czym różni się U2 od Zwyklej liczby binarnej i jeszcze jest 2M czy jak?

 

W U2 masz właśnie najstarszy bit ujemny. Tym się różnią.

Jest to jeden ze sposobów na zpisywanie liczba ujemnych.

 

2M? Nie wiem o co pytasz...

Napisano

Najsatrzy czyli pierwszy z lewej.

Jeśli masz liczbę ośmiobitową:

11111111

W zwykłym kodzie, jest to liczba 256: 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128.

W kodzie U2, te same bity: 11111111 oznaczają 1 + 2 + 4 + 8 +16 + 32 + 64 - 128 czyli liczbę -1.

 

Podobnie liczba 10000000 w zwykłym kodzie: 128, w U2: -128 ;)

Liczba 10000001 - w zwykłym 129, w U2 -127.

 

Generalnie te same bity mog oznaczać różne liczby, w zależności od kodu, w jakim zostają zinterpretowane.

  • Like 1
Napisano

o chłopaki... macie mózgi;D

ja jak miałem programowanie na informatyce to zakuwałem programy w domu i potem pisałem;D A to co tutaj sie dzieje to juz jakiś kosmos poważniejszy jest.

Napisano

Czyli U2 jest zawsze ujemną liczbą? I w przypadku 111 to 1 + 2 - 4? Ale to zawsze wyjdzie -1 Heh

 

Hehe Freedom ja sie zastanawiam czemu sie tam pchałem ...

Czemu nie grafa ale co tam jest czas jak to skoncze to pójde na grafę:)

Napisano

I czmu tak???

Podobnie liczba 10000000 w zwykłym kodzie: 128, w U2: -128

Liczba 10000001 - w zwykłym 129, w U2 -127.

 

128 = -128

129 = -127 WHAT?

Gość mastier
Napisano

O, matko!

Ale herezje piszecie. Znaczy to ostatnie co do cechy to prawda.

Więc po kolei, opowiem na tym konkretnym przykładzie a po resztę odsyłam do świetnych materiałów przygotowanych przez mojego kolegę do nauki Arytmetyki Komputerów na pierwszym roku Informatyki, na wydziale Elektroniki na Politechnice Wrocławskiej :D *(stary, never forget !)

 

http://mr-k.namyslow.eu.org/studia/arytmetyka.html

a konkretnie to

http://wk-group.net/mr-k/pliki/studia/arytmetyka/zmiennoprzecinkowe_v07.pdf

 

 

więc tak

0 11001 0101010111

S E M

 

S - znak (ang. sign)

E - eksponent, wykładnik cecha (ang. exponent)

M - mantysa

 

przeliczanie wygląda następująco

liczba ma postać :

 

(-1)^S * M * 2^E

 

^ - znak potęgi

 

cecha jest zapisem w U2 z obciążeniem (2^(k-1) - 1)

11001

obliczamy tak jak normalny binarny (od najmłodszej pozycji(prawej) ) czyli

1*2^0 + 0*2^1 + 0*2^2 + 1*2^3 + 1*2^4 = 25

dla 5 bitów liczba zapisaną 1ką na najstarszej pozycji (po lewej)

jest 1*2^4 = 16, jeszcze odejmuje my 1, czyli 15

Zatem wykładnik E = 25-15 = 10

 

Dalej mantysa jest ułamkiem, należy pamiętać by dodać 1 (pomijana, dzięki czemu oszczędza się bit), więc liczba ma naprawdę postać

1,0101010111

oczywiście mówimy to o postaci znormalizowanej, postać zdenormalizowana to oddzielna bajka (odsyłam do materiałów).

 

zatem

1*2^0 + 0*2^-1 + 1*2^-2 .... = 1 + 343/1024

 

zatem ostatecznie

 

(-1)^0 * (1+ 343/1024) * 2^10

^

czyli liczba dodatnia

 

I niech moc JB będzie z Wami ! :cool:

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności