background image

 

Jan   Kniat 

http://www.cs.put.poznan.pl/jkniat 

 

 

NIF222.3 

 

PAKIETY MATEMATYCZNE 

 

„ W  obliczeniach  był  błąd. ” 

 

·

  reprezentacja  i  przetwarzanie  danych 

·

  pakiet   

Octave

 

·

  pakiet   

Matematica

 

·

  edytor  

Latex

 

 

 

background image

 

Mnożenie macierzy 

 

#include <stdio.h>   

        // język C 

#define Aw 2 // liczba wierszy A 

#define Ak 3 // liczba kolumn A 
#define Bw 3 // liczba wierszy B 

#define Bk 2 // liczba kolumn B 

void main () 

 

int i, j, m; 

 

double s = 0.0; 

 

double A[Aw][Ak], B[Bw][Bk], C[Aw][Bk]; 

 

 

 

if (Aw != Bk) 

 

 

 

printf("Nieprawidłowe rozmiary.\n"); 

 

 

return; 

 

c

a

b

ik

ij

jk

j

n

=

*

å

=

1

background image

 

 

else 

 

 

 

for (i=0 ; i<Aw ; i++) 

 

 

 

 

 

for (j=0 ; j<Ak ; j++) 

 

 

 

 

 

 

 

printf("A[%d][%d] = ", i,j); 

 

 

 

 

scanf("%lf",&A[i][j]); 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

for (i=0 ; i<Bw ; i++) 

 

 

 

 

 

for (j=0 ; j<Bk ; j++) 

 

 

 

 

 

 

 

printf("B[%d][%d] = ", i,j); 

 

 

 

 

scanf("%lf",&B[i][j]); 

 

 

 

 

 

 

 

 

background image

 

 

 

for (i=0 ; i<Aw ; i++) 

 

 

 

for(j=0 ; j<Bk ; j++) 

 

 

 

 

 

 

 

s = 0.0; 

 

 

 

 

for (m=0 ; m<Ak ; m++) 

 

 

 

 

 

 

 

 

 

s += (A[i][m] * B[m][j]);   

 

 

 

 

 

 

 

 

 

 

 

 

C[i][j] = s; 

 

 

 

 
 

 

for (i=0 ; i<Aw ; i++) 

 

 

 

 

 

for (j=0 ; j<Bk ; j++) 

 

 

 

 

printf("C[%d][%d] =  

                  %5.2lf\n",i,j,C[i][j]); 

 

 

 


 

background image

 

A[0][0] = 1 

A[0][1] = 2 

A[0][2] = 3 
A[1][0] = 10 

A[1][1] = 11 

A[1][2] = 12 

 

B[0][0] = 5 

B[0][1] = 6 

B[1][0] = 15 

B[1][1] = 16 

B[2][0] = 25 
B[2][1] = 26 

 

C[0][0] = 110.00 

C[0][1] = 116.00 

C[1][0] = 515.00 

C[1][1] = 548.00 

 

 

 

background image

 

octave:1> A = [ 1 , 2 , 3 ; 10 , 11 , 12 ] 

A =  

 

  1   2   3 

    10  11  12 

 

octave:2> B = [ 5 , 6 ; 15 , 16 ; 25 , 26 ] 

B = 

         5   6 

        15  16 

        25  26 

 

octave:3> C = A * B 
C = 

      110  116 

      515  548 

 

 

 

 

 

 

background image

 

#include <matrix.h> 

void main() 


 

MTX *A, *B, *C; 

 

MRead  (A, 2, 3); 

 

MRead  (B, 3, 2); 

 

MMult  (C, A, B); 

 

MPrint (C, 2, 2); 

 

·

  zalety PM 

– 

wiele wbudowanych operacji i funkcji 

– 

dokładniejsza reprezentacja danych 

– 

graficzna postać wyników 

– 

tryb interakcyjny,  proste polecenia (początkowo) 

·

  wady PM 

– 

interpretacja programu 

– 

uproszczona składnia 

 

 

 

background image

 

REPREZENTACJA   DANYCH 

 

A.  znaki alfabetu                       C. dźwięki 

B.  liczby                                     D. obrazy 

 

A. Znaki alfabetu 

·

  za pomocą liczb binarnych najczęściej 8-bitowych 

1 bajt = 8 bitów      0 

¸ 255  

·

  kod ASCII  –  8-bitowy 

·

  000 

¸ 127     standard 

·

  128 

¸ 255     znaki narodowe, specjalne 

·

  przestarzały, brak NL, strzałek itp. 

·

  UNICODE – 16-bitowy   (www.unicode.org

 

B. Liczby 

Liczby całkowite bez znaku 

·

  ciągi binarne n-elementowe  0 

¸ (2

– 1)  

  8 b     –     1 B     –     0 

¸ 255 

 

 

 

16 b     –     2 B     –     0 

¸ 65 535 

 

 

 

32 b     –     4 B     –     0 

¸ 4 294 967 295 

background image

 

·

  przeliczanie 

 

BIN è DEC   :  ze wzoru na wartość liczby 

 

L

p

 = a

0

p

0

 + a

1

p

1

 + a

2

p

2

 + ... 

p = 2 

L

2

 = 1a

0

 + 2a

1

 + 4a

2

 + 8a

+ 16a

+ 32a

+ 64a

6

 +  

        128a

7

 + 256a

+ 512a

9

 + 1024a

10

 + ... 

np. 

101100

2

 = 1*0 + 2*0 + 4*1 + 8*1 + 16*0 + 32*1 = 44

10

 

 

DEC è BIN   :  dzielenie przez 2 

 

44  0 

22  0                      44

10 

 = 101100

2

 

11  1 

5  1 

2  0 

1  1 

background image

 

10 

·

 łatwiej przeliczać gdy  p = 2

m

 

 

m = 3      system ósemkowy     cyfry  0 

¸ 7 

 

                               OCT       BIN 

000 

001 

010 

011 

100 

101 

110 

111 

 

1 011 101 001 010 001 110

2

 =  1351216

 

  5403

8

 = 101 100 000 011

2

 

 

 

 

 

background image

 

11 

m = 4     system heksadecymalny (hex) (szesnastkowy) 

 

 

cyfry 0 

¸ 9, A, B, C, D, E, F 

 

                                HEX      BIN      DEC 

1000 

1001 

1010 

10 

1011 

11 

1100 

12 

1101 

13 

1110 

14 

1111 

15 

 

 

 

1001 1110 0000 1111

 = 9E0F

16

 

 

 

AB7DE

16

 = 1010 1011 0111 1101 1110

2

 

 

·

  im mniejsza podstawa tym mniej różnych cyfr ale 

więcej pozycji w liczbie o takiej samej wartości 

·

  system jedynkowy 

 

background image

 

12 

Liczba całkowita bez znaku w rejestrze 

 

                                                                    1 bajt 

 

 

Arytmetyka liczb binarnych całkowitych bez znaku 

·

  dodawanie i odejmowanie jak dla dziesiętnych 

 

      001110               14                    101000               40 

   + 011010            + 26                –  011010           –  26     

   0 101000               40                 0 001110               14 

 

 

 

przeniesienie                            pożyczka 

( nadmiar lub bit                        ( niedomiar lub bit 

  dodawany do                             odejmowany od 

  starszej części                           starszej części 

   liczby )                                       liczby ) 

   

 

    7    6    5   4   3    2   1    0 

       2

7      

...........................     2

background image

 

13 

·

  np. każda liczba zapisana w 2 rejestrach 4–bitowych 

 

                                    91                                          47 

 

                                                                       + 

            + 

                                                                    1011 

         0101                                                + 1111 

         0010                                                1 1010 

         0001 

      0 1000 

 

 

 

 

 

 

 

 

 

   138 

 

·

  mnożenie jak dla dziesiętnych 

011                3 

            

* 101             * 5 

011              15 

            000 

          011 

        001111 

0 1 0 1   1 0 1 1 

0 0 1 0   1 1 1 1 

1 0 0 0   1 0 1 0 

background image

 

14 

·

  dzielenie metodą wielokrotnego odejmowania 

   10100 : 100                                 20 : 4  =  5 

10100 

                         – 100 

                            001                     1                   

                            0010          

                        –    100                  

                         1 1110                  0 

                        +    100                  

                            00100                

                        –      100                

                                000                1                  101 

 

Liczby całkowite ze znakiem 

·

  znak – moduł  

 

 

 

 

 

 

 

 

 

 

   – 127  

¸  + 127 

 

 

 

 

 

 

 

 

 

 

100...0     – 0  

                   znak       moduł                          000...0     + 0 

             +              –   

    7     6      .....................    0 

background image

 

15 

§

  znak – moduł rzadko stosowany bo trudne  +  – 

a + b  è    Z(a) | M(a)  +  Z(b) | M(b) 

1.  Z(a)  =  Z(b)  è  Z(a) | ( M(a)  +  M(b) ) 

2.  Z(a)  

¹  Z(b) 

 

M(a)  >  M(b)                                 M(a)  

£  M(b) 

 

Z(a) | ( M(a) – M(b) )                       Z(b) |  ( M(b) – M(a) )  

 

§

  bardziej użyteczny dla   

*  i  /  è wtedy niekiedy 

stosowany wewnętrznie w arytmometrze 

 

·

  uzupełnienie do 2  (Uzp2) 

 

 

 

 

 

 

 

 

   0000  0001         . . .            0111  1000             . . .          1111  10000   

           liczby  +                                         liczby 

 

background image

 

16 

0 0 0 1 

+ 1 

1 0 0 1 

– 7 

0 0 1 0 

+ 2 

1 0 1 0 

– 6 

0 0 1 1 

+ 3 

1 0 1 1 

– 5 

0 1 0 0 

+ 4 

1 1 0 0 

– 4 

0 1 0 1 

+ 5 

1 1 0 1 

– 3 

0 1 1 0 

+ 6 

1 1 1 0 

– 2 

0 1 1 1 

+ 7 

1 1 1 1 

– 1 

 

                   0 0 0 0  è     0       1 0 0 0        – 8  

 

§

  liczba 4–bitowa Uzp2   è    – 8 

¸ + 7 

§

  obliczanie liczby przeciwnej dla Uzp2 

                             0101              + 5 

                        ~   1010 

                        +         1 

                             1011              – 5 

 

                             1011             – 5 

                        ~   0100 

                        +         1 

 

                      0101             + 5   

background image

 

17 

§

  dodawanie i odejmowanie niezależne od znaków è 

wynik poprawny, gdy nie ma nadmiaru 

                     0111                  7 

                 +  1011           + (– 5 ) 

                   1 0010                 2  

                       przeniesienie (pomijamy) 

§

  zamiast odejmowania dodawanie liczby przeciwnej 

4  –  6  =  4  +  (– 6 ) 

                      0100           4            

                   + 1010    + (– 6 ) 

                   0 1110        – 2 

§

  mnożenie  –  algorytm Booth’a  (Uzp2) 

1)  wpisz mnożnik do rejestru o podwójnej długości 

2)  dopisz 0 z prawej strony 

3)  na podstawie stanu ostatnich 2 bitów wykonaj: 

00  ,  11  –  nic nie rób 

10           –  odejmij mnożną 

01           –  dodaj mnożną 

4)  przesuń wynik o 1 pozycję w prawo arytmetycznie 

     (chyba, że jest to ostatni krok) 

5)  dla liczb n-bitowych mamy n-kroków 

background image

 

18 

Np.          6  *  ( – 2 )  =  – 12 

mnożnik  =  000110   

 

// + 6 

mnożna   =  111110   

 

// – 2 

 

     0 0 0 0 0 0 0 1 1 0 0 

     0 0 0 0 0 0 0 0 1 1 0 

–   0 0 0 1 0 

     0 0 0 1 0 0 0 0 1 1 0 

     0 0 0 0 1 0 0 0 0 1 1  

     0 0 0 0 0 1 0 0 0 0 1

 

+   1 1 1 1 0  

     1 1 1 1 0 1 0 0 0 0 1 

     1 1 1 1 1 0 1 0 0 0 0 

 

 

~    0 0 0 0 0 1 0 1 1 

+                            1 

      0 0 0 0 0 1 1 0 0    =    12

10

 

 

 

 

background image

 

19 

·

  wykrywanie nadmiaru 

 

§

  dla znak – moduł nadmiar,  

gdy przeniesienie na bit znaku = 1 

                       0 110            6 

                  +   0 011         + 3 

                       1 001            9 

 

 

§

  dla Uzp2  

   0110   6       1010    –6        0110    6           1010    –6 

 +0100   4     +1100    –4      +1100  –4         +0100   +4     

0 1010         1 0110              1 0010             0 1110   

    OV                OV                     OK.                   OK. 

C

= 0           C

= 1                C

= 1               C

= 0 

C

= 1           C

= 0                C

= 1               C

= 0 

 

 

 

 

C

  +  C

s   

=  1   è  nadmiar 

 

 

background image

 

20 

Przetwarzanie liczb całkowitych ze znakiem 

·

  rejestry procesora 

 

 

 

 

 

 

·

  zapis danych w pamięci 

 

 

 

 

 

 

 

 

 

 

 

                                                  (little endian) 

   AH            AL 

           

BH            BL 

           

CH

             

CL 

           

DH 

            

DL 

EAX 
EBX 
ECX 

  EDX 

   31                         16 15          8  7             0 

REJESTRY UNIWERSALNE  INTEL 

BX 

AX 

CX 
DX 

 

 
 

 
 

 
n+1 
 
 

m+1 

m+2 

m+3 

 

   7                          0 

RX 

   

RH         RL 

BAJT 

LOW 
HIGH 

   

RH         RL 

RX 

LOW 

HIGH 

AX 

DX 

   

AH         AL 

   

DH         DL 

background image

 

21 

·

  rozkazy arytmetyczne Intel 

    ADD  ARG1,  ARG2    

; ARG1 ç ARG1 + ARG2 

ARG2  ( źródło ) 

 

R8 

R16 

R32 

PAO 

stała 

R8 

– 

– 

R16 

– 

– 

R32

 

– 

– 

PAO 

– 

( znaczniki arytmetyczne ) 

 

ADC  ARG1,  ARG2       ; ARG1 ç ARG1 + ARG2 + CF 

 

 

 

ADD  EAX, ECX   

    ; ustawia CF   

ADC  EBX, EDX 

 

SUB  ARG1,  ARG2   

; ARG1 ç ARG1 – ARG2 

SBB  ARG1,  ARG2    

; ARG1 ç ARG1 – ARG2 – CF 

INC  ARG1   

 

 

; ARG1 ç ARG1 + 1 

DEC  ARG1   

 

 

; ARG1 ç ARG1 – 1 

ARG1 
( cel ) 

LOW 

HIGH 

EAX 
EBX 

ECX 
EDX 

LOW 

HIGH 

background image

 

22 

NEG  ARG1   

 

 

; ARG1 ç – ARG1 (Uzp2) 

CMP  ARG1,  ARG2   

; ARG1 – ARG2 

MUL  ARG1   

 

 

; R8, R16, PAO 

IMUL  ARG1  

 

 

; R8, R16, PAO 

DIV ARG1   

 

 

; R8, R16, PAO 

IDIV  ARG1   

 

 

 

; R8, R16, PAO 

 

 

Liczby całkowite kodowane dziesiętnie (BCD 

·

  operacje programu sumującego liczby całkowite 

125 + 378 = 503 

§

  wczytanie znaków 1, 2, 5 

§

  konwersja znakowo – binarna 

§

  wczytanie znaków 3, 7, 8 

§

  konwersja znakowo – binarna 

§

  dodawanie binarne 

§

  konwersja binarno – znakowa 

§

  wyprowadzenie znaków 5, 0, 3 

 

 

 

background image

 

23 

·

  konwersje  

§

  CHAR – BIN  

1.  zeruj wynik 

2. dla każdej kolejnej cyfry oblicz 

wynik * 10  + ( kod_cyfry – 30H )  

§

  BIN – CHAR 

1.  podziel liczbę przez 10

n

 ( n = liczba cyfr – 1 ) 

2.  iloraz + 30H è kolejny kod_cyfry wyniku 

3.  odejmij od liczby 10

n

 * iloraz 

4.  n = n – 1  i powtarzaj aż do n = 0 

 

·

  dlatego liczby BCD,  w kolejnych bajtach : 

(liczba 125

10

 =  01111101

§

  kody ASCII cyfr 

                                              125 

     

 

§

  kody ASCII – 30H 

                                                 125 

 

 

 31H    32H    35H 

   1          2         5 

00110001   00110010   00110101 

00000001   00000010   00000101 

background image

 

24 

§

  dwa kody ASCII – 30H  (format upakowany) 

                                                          125 

 

 

 

·

  procesory posiadają rozkazy realizujące + i –  

oraz dla niektórych formatów * i / 

·

  zazwyczaj niedostępne w uniwersalnych 

    językach programowania  

 

Liczby niecałkowite 

·

  zapis stałopozycyjny  

 

                                                

· 

               liczba całkowita              ułamek 

 

. . . a

2

p

2

 + a

1

p

+ a

0

p

+ a

-1

p

-1

 + a

-2

p

-2

 . . .  

 

§

  konwersja binarno – dziesiętna  

    101.01 = 1*2

2

 + 0*2

1

 + 1*2

0

 + 0*2

-1

 * 1*2

-2

 = 

                   4 + 0 + 1 + 0 + ¼  =  5¼ = 5.25 

1  2     5  0   

   . . . 

   . . . 

         00010010   01010000  

background image

 

25 

§

  konwersja dziesiętno – binarna  0.43 = 

0  43  * 2 

0  86 

1  72 

1  44 

 

 

 

 

0  88               0.43 = 0.0110111 ... 

 

 

 

 

1  76 

 

 

 

 

1  52 

 

 

 

 

1  04 

 

 

 

 

0  08 

 

 

§

  zapis stałopozycyjny 

 

 

 

 

§

  dodawanie i odejmowanie jak dla liczb całkowitych 

bez znaku (znaki ew. jako odrębne bity) 

§

  mnożenie i dzielenie è algorytmy iteracyjne 

prostsze niż dla liczb zmiennopozycyjnych 



liczba całkowita           ułamek 

      16b                             16b        

   4  cyfry             

.

       4  cyfry 

 dziesiętne                   dziesiętne 

background image

 

26 

·

  zapis zmiennopozycyjny 

±m * p

±c

     

§

  p = 10    1.57*10

12    

1.57E12   157xxx....xxx

 

 

                                                          13 cyfr 

§

  normalizacja 

125.78E5 

12.578E6                            0.12578E8 

12578E3 

§

  p = 2 ,  standard IEEE 754 

 

 

 

                                                                01...00 è – 3  

          cecha   

   

 

                   01...01 è – 2 

         przesunięta 

 

 

              01...10 è – 1 

                                                              01...11 è    0 

 

 

 

 

 

 

 

 

 

10...00 è    1 

znak  liczby  

         

 

 

 

10...01 è    2 

0 è +   

 

 

 

 

 

 

10...10 è    3 

1 è –   

 

 

 

 

 

 

10...11 è    4 

s              c                                             m 

 63    62                           52  51                                                                          0 

background image

 

27 

§

  mantysa znormalizowana (m) ma zawsze postać 

1.xxxxxxxx....xxxxx     ( 1.0...0  

¸  1.1..1 ) 

         początkowa jedynka nie jest pamiętana 

 

 

1.0

10

  ≤  m  <  2.0

10

   

§

  przykłady 

 

0

10

       è     0  00000000000  00..00 

1.0

10

    è     0  01111111111  00...00 

–1.0

10   

è

     1  01111111111  00...00 

10

10

     è     0  10000000010  0100..00 

–10

10

   è     1  10000000010  0100..00 

15.5    è      0 10000000010  111100..00 

–15.5  è      1 10000000010  111100..00 

 

§

  reprezentowane wartości 

 

 

1 1..1 1..1           1 0..01 0..0       0 0..0 0..0    0 0..01 0..0           0 1..1 1..1 

 

 

          ujemne                  zero                    dodatnie 

background image

 

28 

 

 

 

 

n è liczba cyfr mantysy 

 

§

  dla n = 52  odległość pomiędzy reprezentowanymi 

liczbami wynosi: 

c = 0   è   2.22044604925e-16 

c = 1   è   4.440892098501e-16   

c = 52 è  1 

c = 150  è   3.169126500571e+29 

c =  1023 è   1.995840309535e+292 

 

 

 

 

 

 

 

 

    0          2

0

        2

1

                    2

2

                                                2

3

 

       2

n                        

2

n

                                  2

background image

 

29 

·

  dodatkowe obiekty zmiennopozycyjne 

 

ciąg binarny 

obiekt 

       s 00...000 00...000 

± 0 

       s 11.....11 00...000 

± ¥ 

       s 11.....11 xx...xxx 

NaN 

 

 

·

  operacje wytwarzające wynik NaN 

operacja 

wyrażenia 

¥ + (- ¥ )    ,    x + NaN 

– 

¥ – ¥    ,    (- ¥ ) – (- ¥ )     ,    x – NaN 

0 * ( 

± ¥ )   ,    x * NaN 

0 / 0     ,     

¥ / ¥    ,    x / NaN  

REM 

x REM 0   ,   x REM 

¥ ,  

x REM NaN   ,   NaN REM x 

SQRT 

SQRT (x) gdy x < 0  ,   SQRT (NaN)  

 

 

 

 

background image

 

30 

§

  typy liczb zmiennopozycyjnych   

w językach programowania 

float :                32b  1 / 8 / 23        

±3.4 E ±38        7 cyfr 

double :            64b  1 / 11 / 52      

±1.7 E ±308    15 cyfr 

long double:    80b   1 / 15 / 64     

±1.2 E ±4932   17 cyfr 

 

·

  arytmetyka zmiennopozycyjna 

§

  mnożenie è mnożenie mantys, sumowanie cech, 

normalizacja 

§

  dzielenie è dzielenie mantys, odejmowanie cech, 

normalizacja 

§

  dodawanie è wyrównanie cech, dodawanie, 

normalizacja 

§

  odejmowanie èwyrównanie cech, odejmowanie, 

normalizacja 

§

  dla 3 cyfr dokładnych 

0.375 * 10

 +  0.25 * 10

-2  

0.375 * 10

5  

+  0.000000025 * 10

5

 = 

0.375000025 * 10

5

 

@  0.375 * 10

5

 

background image

 

31 

§

  sposób sumowania trzech liczb 

zmiennopozycyjnych aby błąd był najmniejszy 

§

  obliczenia zmiennopozycyjne na odpowiedzialność  

programisty 

§

  arytmetyka interwałowa 

– 

tryby zaokrąglania :  

  do najbliższej, w górę, w dół, obcięcie 

– 

wykonanie operacji 2 razy : 

z zaokrągleniem w górę i z zaokrągleniem w dół 

– 

przedział na pewno zawierający wynik poprawny 

– 

operacje arytmetyczne, algorytmy numeryczne, 

biblioteki 

·

  reprezentacje dokładne