Architektury systemów komputerowych - Lista 7.

Program bc jest zdefiniowanym przez standard POSIX kalkulatorem o składni podobnej do tej z języka C. Można w nim (między innymi) w łatwy sposób konwertować wartości pomiędzy różnymi radiksami:

obase=2
ibase=16
F43.12E
111101000011.0001001010

Uwaga, jeśli zmienimy ibase (input base) to wszystkie wpisywane liczby będą interpretowane w tym radiksie. Oto przykład:

ibase=2
obase=10
1001
1001

(10_2 == 2_{10}). Cyfry heksadecymalne muszą być wielkimi literami (małe litery to zmienne).

Zadanie 1.

radix 2 radix 10 radix 16
10'1111.0(1001) 47.3 2F.4(C)
1111'0011'1110'0100'.0101'0001 62436.62890625 F3E4.A1
10'0110.1011 38.6875 26.B

Zadanie 2.

  • Zadanie sprowadza się do tego: skończona suma wyrażeń postaci 2^{-n} ma skończone rozwinięcie dziesiętne.
  • Suma takich wyrażeń da się zapisać jako ułamek o podstawie będącej potęgą dwójki: 2^m.
  • Ułamki postaci l/(10^k) mają skończone rozwinięcie dziesiętne.
  • Przemnóżmy przeto licznik i mianownik naszej sumy przez 5^m.

Matematycznie:
Część całkowita zawsze wyraża się skończoną liczbą cyfr. Rozważmy część ułamkową.
0.a_1a_2a_3a_4…a_n = \sum_{i=1}^n2^{-i}a_i = \sum_{i=1}^n2^{-i}5^{-i}5^ia_i = \sum_{i=1}^n10^{-i} 5^i a_i = \sum_{i=1}^n \frac{5^i a_i}{10^i}
Suma liczb, które w mianowniku mają potęgę 10 ma oczywiście skończone rozwinięcie dziesiętne. To zadanie wyjaśnia również, dlaczego ujemne potęgi dwójki wyglądają jak potęgi piątki (0.5, 0.25, 0.125…)

Zadanie 3.

  • Trzy najmniejsze wartości:
    • 000'00000 = 2^{-3} * 1 = 0.125
    • 000'00001 = 2^{-3} * (1+1/32) = 0.12890625
    • 000'00010 = 2^{-3} * (1+1/16) = 0.1328125
  • Trzy największe wartości:
    • 111'11111 = 2^{4} * 1.96875 = 31.5
    • 111'11110 = 2^{4} * 1.93750 = 31
    • 111'11101 = 2^{4} * 1.90625 = 30.5
  • 31.5/31 = 1.01612903225806451612
  • 0.12890625/0.125 = 1.03125
  • 2^8 = 256

Zadanie 4.

  • 1.2 = 011'00110
  • 5.75 = 101'01110

011'00110 + 101'01110 = 101'10111

Zadanie 5.

  • Udowodnimy, że nie jest łączne
  • Weźmy:
    • x = 1_2 = 011'00000
    • y = 1.00001_2 = 011'00001
    • z = 0.00101_2 = 000'01000
  • pokażemy że (x+y)+z ≠ x+(y+z)
    • x+y = 100'00000 ←przy dodawaniu mantys (1.0 + 1.00001) ucieliśmy najmniej znaczacy bit, który okazał się rózny od zera
    • (x+y)+z = 100'00000 + 000'01000 = 100'00010 ← znowu ucieliśmy znaczący bit (przy przesuwaniu (dzieleniu przez 2^4) mantysy 1.01)
    • y+z = 011'00110
    • x+(y+z) = 011'00000 + 011'00110 = 100'00011

Zadanie 6.

Zadanie 7.

Zadanie 8.

liczba znak wykladnik mantysa
0.5 0 126 (-1) (1)0
-17 1 127 (0) (1)0001
-1/32 1 122 (-5) (1)0
384 0 134 (7) (1)1

Zadanie 9.

  • A'/A = 0,2228/0,22288 ~ 0,999641
  • B'/B = 0,2221/0,22211 ~ 0,999954
  • (A' - B')/(A-B) = (0,2228 - 0,2221)/(0,22288 - 0,22211) = 0,0007/0,00077 = 0,90909090…

Zadanie 10.

  • 1'0111111'01110000'00000000'00000000_{IBM} = - 16^{63-64} * 0.7_{16} = - 16^{-1} * 7/16 = -7/256
  • 14.3 = E.4CCCC…_{16} = 1110.010011001100110011_{2} = 16^1 * 0.11100100110011001100110_{2} = 0'0000001'11100100'11001100'11001100_{IBM}
  • 0'1111111'11111111'11111111'11111111_{IBM} = 16^{127-64} * FFFFFF_{16} = 16^63 * 16777215 = 121416798527102489600204155203283368622156186611384678475703023142582517330754928640

Zadanie 11.

  • Mantysa najmniejszej liczby będzie się zaczynała od 001 zamiast 0001.
  • Najwyższa potęga będzie 8^63 a nie 16^63.
  • 16^{63} * FFFFFF_{16} = 121416805764108066932466369176469931665150427440758720078238275608681517825325531136.
  • 8^{63} *77777777_{8} = 13164036458569648337239753460458804039861886925068638906788872192.
 
architektury_systemow_komputerowych/lista7.txt · ostatnio zmienione: 2009/12/03 21:06 przez d
 
Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji:MIT License
Recent changes RSS feed