Rok akademicki 18/19, Wykład nr 4 /63 Plan wykładu nr 4 Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia niestacjonarne I stopnia Rok akademicki 18/19 Wykład nr 4 (9.3.19) Kodowanie liczb NKB, BCD, z 5, Graya Reprezentacja liczb całkowitych bez znaku, ze znakiem (ZM, U1, U) Reprezentacja zmiennoprzecinkowa zapis zmiennoprzecinkowy liczby rzeczywistej, postać znormalizowana zakres liczb zmiennoprzecinkowych Standard IEEE 754 liczby 3-bitowe i 64-bitowe, zakres i precyzja liczb wartości specjalne, operacje z wartościami specjalnymi Rok akademicki 18/19, Wykład nr 4 3/63 Rok akademicki 18/19, Wykład nr 4 4/63 Kodowanie Kody liczbowe - Naturalny Kod Binarny (NKB) Kodowanie - proces przekształcania jednego rodzaju postaci informacji na inną postać Jeżeli dowolnej liczbie dziesiętnej przypiszemy odpowiadającą jej liczbę binarną, to otrzymamy naturalny kod binarny (NKB) Kody Alfanumeryczne ASCII ISO 646 ISO 8859 EBCDIC Unicode Liczbowe NKB BCD 1 z N z 5 U Inne Graya Morse a
Rok akademicki 18/19, Wykład nr 4 5/63 Rok akademicki 18/19, Wykład nr 4 6/63 Kody liczbowe - Kod BCD Kody liczbowe - Kod BCD Binary-Coded Decimal - dziesiętny zakodowany dwójkowo Przykład: BCD - sposób zapisu liczb polegający na zakodowaniu kolejnych cyfr liczby dziesiętnej w 4-bitowym systemie dwójkowym (NKB) 168 =? (BCD) 1 6 8 1 11 1 168 11 11 11 =? 11 11 11 (BCD) 9 5 3 = 1111(BCD) 111111(BCD) = 953 W ogólnym przypadku kodowane są tylko znaki 9 Pozostałe kombinacje bitowe mogą być stosowane do kodowania znaku liczby lub innych znaczników. Zastosowania: urządzenia elektroniczne z wyświetlaczem cyfrowym (np. kalkulatory, mierniki cyfrowe, kasy sklepowe, wagi) przechowywania daty i czasu w BIOSie komputerów (także wczesne modele PlayStation 3) zapis części ułamkowych kwot (systemy bankowe). Rok akademicki 18/19, Wykład nr 4 7/63 Rok akademicki 18/19, Wykład nr 4 8/63 Kody liczbowe - Kod BCD: przechowywanie liczb Kody liczbowe - Kod BCD Użycie 4 najmłodszych bitów jednego bajta, 4 starsze bity są ustawiane na jakąś konkretną wartość: 1111 (np. kod EBCDIC, liczby F (16) F9 (16) ) 11 (tak jak w ASCII, liczby 3 (16) 39 (16) ) Zapis dwóch cyfr w każdym bajcie (starsza na starszej połówce, młodsza na młodszej połówce) - jest to tzw. spakowane BCD w przypadku liczby zapisanej na kilku bajtach, najmniej znacząca tetrada (4 bity) używane są jako flaga znaku standardowo przyjmuje się 11 (C (16) ) dla znaku plus (+) i 111 (D (16) ) dla znaku minus (-), np. 17 17 = 1 1 111 11 = 1 1 111 111 (17C (17D (16) (16) ) ) Warianty kodu BCD: Cyfra dziesiętna 1 3 4 5 6 7 8 9 BCD 841 1 1 11 1 11 11 111 1 11 Excess-3 11 1 11 11 111 1 11 11 111 11 BCD 41 1 1 11 1 111 11 111 111 1111 BCD 84--1 111 11 11 1 111 11 11 1 1111 IBM 141 BCD 841 11 1 1 11 1 11 11 111 1 11 Podstawowy wariant: BCD 841 (SBCD - Simple Binary Coded Decimal)
Rok akademicki 18/19, Wykład nr 4 9/63 Rok akademicki 18/19, Wykład nr 4 1/63 Kody liczbowe - Kod z 5 Kody liczbowe - Kod z 5 Industrial (196 r.) Kod 5-bitowy: bity zawsze równe 1, a 3 bity zawsze równe Koduje 1 znaków (cyfry dziesiętne), kody nie są wzajemnie jednoznaczne (ta sama wartość może być zakodowana w różny sposób) Kod stałowagowy Kod detekcyjny Stosowany głównie w kodach kreskowych Jednowymiarowy kod kreskowy kodujący cyfry: 9 Znak to 5 pasków: szerokie i 3 wąskie Szeroki pasek jest wielokrotnością wąskiego, szerokości muszą być takie same dla całego kodu Struktura kodu: start: 11111 numer stop: 11111 Rok akademicki 18/19, Wykład nr 4 11/63 Rok akademicki 18/19, Wykład nr 4 1/63 Kod Graya (refleksyjny) Kod Graya Kod dwójkowy, bezwagowy, niepozycyjny Dwa kolejne słowa kodowe różnią się stanem jednego bitu Stosowany w przetwornikach analogowo-cyfrowych, do cyfrowego pomiaru analogowych wielkości mechanicznych (np. kąt obrotu) Kod cykliczny - ostatni i pierwszy wyraz również różnią się stanem jednego bitu http://tams-www.informatik.uni-hamburg.de /applets/hades/webdemos/1-gates/15-graycode/dualgray.html
Rok akademicki 18/19, Wykład nr 4 13/63 Rok akademicki 18/19, Wykład nr 4 14/63 Reprezentacja liczb w systemach komputerowych Liczby całkowite bez znaku Zapis liczby w systemie dwójkowym: Używając n-bitów można zapisać liczbę z zakresu: n X( ) =, 1 8 bitów 16 bitów 3 bity 64 bity... 55... 65 535... 4 94 967 95... 18 446 744 73 79 551 615 18 trylionów 446 biliardów 744 biliony 73 miliardy 79 milionów 551 tysięcy 615 Rok akademicki 18/19, Wykład nr 4 15/63 Rok akademicki 18/19, Wykład nr 4 16/63 Liczby całkowite bez znaku w języku C Liczby całkowite bez znaku w języku C Typy zmiennych całkowitych bez znaku stosowane w języku C: Typ unsigned char (1 bajt): Nazwa typu Rozmiar (bajty) Zakres wartości unsigned char 1 bajt 55 unsigned short int bajty 65 535 unsigned int 4 bajty 4 94 967 95 unsigned long int 4 bajty 4 94 967 95 unsigned long long int 8 bajtów 18 446 744 73 79 551 615 MSB (Most Significant Bit) - najbardziej znaczący bit, najstarszy bit, największa waga W nazwach typów short i long można pominąć słowo int: unsigned short int unsigned short unsigned long int unsigned long LSB (Least Significant Bit) - najmniej znaczący bit, najmłodszy bit, najmniejsza waga Zakres wartości: unsigned long long int unsigned long long dolna granica: () = (16) = górna granica: 11111111 () = FF (16) = 55
Rok akademicki 18/19, Wykład nr 4 17/63 Rok akademicki 18/19, Wykład nr 4 18/63 Liczby całkowite bez znaku w języku C Liczby całkowite bez znaku w języku C Typ unsigned short int ( bajty): Typy unsigned int (4 bajty) i unsigned long int (4 bajty): Typ unsigned long long int (8 bajtów): 15 14 13 1 11 1 9 8 7 6 5 4 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 14 13 1 11 1 9 8 7 6 5 4 3 1 #include <stdio.h> unsigned short int: 65535 1 unsigned int: 49496795 1 unsigned long int: 49496795 1 unsigned long long int: 184467447379551615 1 int main() /* przepełnienie zmiennej, ang. integer overflow */ { unsigned short int usi = 65535; unsigned int ui = 49496795; unsigned long int uli = 49496795; unsigned long long int ulli = 184467447379551615; } printf("unsigned short int: %hu %hu %hu\n",usi,usi+1,usi+); printf("unsigned int: %u %u %u\n",ui,ui+1,ui+); printf("unsigned long int: %lu %lu %lu\n",uli,uli+1,uli+); printf("unsigned long long int: %llu %llu %llu\n", ulli,ulli+1,ulli+); return ; Rok akademicki 18/19, Wykład nr 4 19/63 Rok akademicki 18/19, Wykład nr 4 /63 Liczby całkowite bez znaku w języku C #include <stdio.h> unsigned short int: 1 65535 unsigned int: 1 49496795 unsigned long int: 1 49496795 unsigned long long int: 1 184467447379551615 int main() /* przepełnienie zmiennej, ang. integer overflow */ { unsigned short int usi = 1; unsigned int ui = 1; unsigned long int uli = 1; unsigned long long int ulli = 1; } printf("unsigned short int: %hu %hu %hu\n",usi,usi-1,usi-); printf("unsigned int: %u %u %u\n",ui,ui-1,ui-); printf("unsigned long int: %lu %lu %lu\n",uli,uli-1,uli-); printf("unsigned long long int: %llu %llu %llu\n", ulli,ulli-1,ulli-); return ; Liczby całkowite ze znakiem - kod znak-moduł X Inne nazwy: ZM, Z-M, SM (Signed Magnitude), S+M Najstarszy bit jest bitem znaku liczby: - dodatnia, 1 - ujemna Pozostałe bity mają takie same znaczenie jak w NKB Wartość liczby: n 1 n x x i = ( x + x1 + x +... + x n ) ( 1) = ( 1) xi i= moduł znak
Rok akademicki 18/19, Wykład nr 4 1/63 Rok akademicki 18/19, Wykład nr 4 /63 Liczby całkowite ze znakiem - kod znak-moduł Liczby całkowite ze znakiem - kod znak-moduł Liczby 4-bitowe (1 bit - znak, 3 bity - moduł) w kodzie Z-M: Zamiana liczby dziesiętnej na kod Z-M: dwie reprezentacje zera + ( ( ZM) ) ( 1ZM) liczba dodatnia 93 =?(ZM) zamieniamy liczbę na NKB 93 = 11111(NKB) liczba ujemna 93 =?(ZM) zamieniamy moduł liczby na NKB 93 = = 93 11111(NKB) dodajemy bit znaku dodajemy bit znaku Zakres liczb dla n-bitów: X = + 1, 1 dla 8 bitów : dla 16 bitów: 17... 17 3767... 3767 93 = 11111(ZM) 93 = 111111(ZM) Rok akademicki 18/19, Wykład nr 4 3/63 Rok akademicki 18/19, Wykład nr 4 4/63 Liczby całkowite ze znakiem - kod U1 Liczby całkowite ze znakiem - kod U1 Inne nazwy: U1, ZU1, uzupełnień do jedności Najstarszy bit jest bitem znaku liczby: - dodatnia, 1 - ujemna Wszystkie bity liczby posiadają takie same wagi jak w NKB, oprócz pierwszego bitu, który ma wagę - n-1 + 1 Liczby 4-bitowe (1 bit - znak, 3 bity - moduł) w kodzie U1: liczby dodatnie zapisywane są tak samo jak w NKB liczby ujemne otrzymywane są poprzez bitową negację dwie reprezentacje zera Wartość liczby: 1 n X = x + x1 + x +... + x n + x ( + 1) Zakres liczb dla n-bitów: X = + 1, 1 dla 8 bitów : dla 16 bitów: 17... 17 3767... 3767
Rok akademicki 18/19, Wykład nr 4 5/63 Rok akademicki 18/19, Wykład nr 4 6/63 Liczby całkowite ze znakiem - kod U1 Liczby całkowite ze znakiem - kod U Zamiana liczby dziesiętnej na kod U1: liczba dodatnia liczba ujemna 93 =?(U1) 93 =?(U1) Inne nazwy: ZU, uzupełnień do dwóch, two s complement Najstarszy bit jest bitem znaku liczby: - dodatnia, 1 - ujemna zamieniamy liczbę na NKB zamieniamy moduł liczby na U1 93 = 11111(NKB) 93 = = 93 11111(U1) dodajemy bit znaku: 93 = 11111(U1) negujemy wszystkie bity 93 = 111(U1) Wartość liczby: X 1 n = x + x + x +... + x 1 n + x ( ) bit znaku Kod U jest obecnie powszechnie stosowany w informatyce Rok akademicki 18/19, Wykład nr 4 7/63 Rok akademicki 18/19, Wykład nr 4 8/63 Liczby całkowite ze znakiem - kod U Liczby 4-bitowe (1 bit - znak, 3 bity - moduł) w kodzie U: Liczby całkowite ze znakiem - kod U Zamiana liczby dziesiętnej na kod U: brak podwójnej reprezentacji zera liczb ujemnych jest o jeden więcej niż dodatnich... zawsze oznacza 11...111 zawsze oznacza -1 liczba dodatnia 75 =?(U) zamieniamy liczbę na NKB 75 = 1111(NKB) liczba ujemna 75 =?(U) zamieniamy moduł liczby na U 75 = = 75 1111(U) Zakres liczb dla n-bitów: X =, 1 dla 8 bitów : dla 16 bitów: 18... 17 3768... 3767 dodajemy bit znaku: 75 = 1111(U) negujemy wszystkie bity i dodajemy 1 1111 negacja : 1111 + 1: 1 75 ( = 11111 1) (U)
Rok akademicki 18/19, Wykład nr 4 9/63 Rok akademicki 18/19, Wykład nr 4 3/63 Liczby całkowite ze znakiem - kod U w języku C Liczby całkowite ze znakiem - kod U w języku C Typy zmiennych całkowitych ze znakiem stosowane w języku C: Nazwa typu Rozmiar (bajty) Zakres wartości Typ char / signed char (1 bajt): char 1 bajt -18 17 short int bajty -3 768 3 767 int 4 bajty - 147483648 147483647 long int 4 bajty - 147483648 147483647 long long int 8 bajtów -9 3 37 36 854 775 88-9 3 37 36 854 775 87 Przed nazwą każdego z powyższych typów można dodać signed signed char, signed short int, signed int W nazwach typów short i long można pominąć słowo int: short int short, long int long, long long int long long Zakres wartości: dolna granica: 1 () = -18 górna granica: 1111111 () = 17 inne wartości: 11111111 () = -1 () = Rok akademicki 18/19, Wykład nr 4 31/63 Rok akademicki 18/19, Wykład nr 4 3/63 Liczby całkowite bez znaku w języku C Liczby całkowite ze znakiem - kod U w języku C Typ short / signed short int ( bajty): Typy int / signed int (4 bajty) i long / signed long int (4 bajty): Typ long long int / signed long long int (8 bajtów): #include <stdio.h> short int: 3767-3768 -3767 int: 147483647-147483648 -147483647 long int: 147483647-147483648 -147483647 long long int: 93373685477587-93373685477588 int main() /* przepełnienie zmiennej, ang. integer overflow */ { short int si = 3767; int i = 147483647; long int li = 147483647; long long int lli = 93373685477587; } printf("short int: %hd %hd %hd\n",si,si+1,si+); printf("int: %d %d %d\n",i,i+1,i+); printf("long int: %ld %ld %ld\n",li,li+1,li+); printf("long long int: %lld %lld\n",lli,lli+1); return ;
Rok akademicki 18/19, Wykład nr 4 33/63 Rok akademicki 18/19, Wykład nr 4 34/63 Zapis zmiennoprzecinkowy liczby rzeczywistej Zapis zmiennoprzecinkowy liczby rzeczywistej Zapis bardzo dużych lub małych liczb wymaga dużej liczby cyfr Znacznie prostsze jest przedstawienie liczb w postaci zmiennoprzecinkowej (ang. floating point numbers) 1 = 1, 1 13,1 1 = 1, 1-1 Zapis liczby zmiennoprzecinkowej ma postać: gdzie: L - wartość liczby M - mantysa L = M B B - podstawa systemu E - wykładnik, cecha notacja naukowa: 1,e13 1,e+13 1,E13 1,E+13 postać wykładnicza: 1, 1 13 E,43 = 3 1 =,43 1 43 6,59 1 = 6,59,1 =,659 1,11 1 B = 1 11 () M = 1,11 3,11 1 B = 1 E = 3 () E = 11 (4) () 1,11 1 (4) 3,11 1 () =? = 1 + 1 1 = + 1 = 11 () 3 (4) M = 3,11 (4) 3 (4) =? = 3 4 + 1 4 1 1 = 4 + 1 4 = 4 = 3,3965 4 + 1 14 + 4 + 1 1 = 4 + 3 4 = + 1 = 14 3 1 = 1 + + 1 = 1+ 4 = 5 5 = 1,375 = 1,375 3 = 44 + 1 4 3 = 91 163 968 = 1,375 = 3,3965 Rok akademicki 18/19, Wykład nr 4 35/63 Rok akademicki 18/19, Wykład nr 4 36/63 Postać znormalizowana zapisu liczby Liczby zmiennoprzecinkowe w systemie binarnym Położenie przecinka w mantysie nie jest ustalone i może się zmieniać Liczba bitów przeznaczonych na mantysę i wykładnik jest ograniczona Poniższe zapisy oznaczają tę samą liczbę (system dziesiętny) 43 1 1 = 4,3 1 =,43 1 3 =,43 1 4 Dla ujednolicenia zapisu i usunięcia wielokrotnych reprezentacji tej samej liczby, przyjęto tzw. postać znormalizowaną zapisu liczby W postaci znormalizowanej mantysa spełnia nierówność: Przykład: B > M 1,43 1 3 - to jest postać znormalizowana, gdyż: 1>,43 1,43 1 4 - to nie jest postać znormalizowana 4,3 1 - to nie jest postać znormalizowana Wartość liczby L: gdzie: S L = ( 1) M B S - znak liczby (ang. sign), przyjmuje wartość lub 1 M - znormalizowana mantysa (ang. mantissa), liczba ułamkowa B - podstawa systemu liczbowego (ang. base) E - wykładnik (ang. exponent), cecha, liczba całkowita W systemie binarnym podstawa systemu jest stała: B = L = ( 1) M E S E
Rok akademicki 18/19, Wykład nr 4 37/63 Rok akademicki 18/19, Wykład nr 4 38/63 Przesunięcie wykładnika Zakres liczb zmiennoprzecinkowych Wykładnik zapisywany jest z przesunięciem (ang. bias) Zakres liczb w zapisie zmiennoprzecinkowym: S L = ( 1) M E BIAS x max, x min { } x min, x max gdzie: L - wartość liczby S - znak liczby M - mantysa E - wykładnik BIAS - przesunięcie (nadmiar) Typowe wartości przesunięcia (nadmiaru) wynoszą: formatu 3-bitowy: 7-1 = 17 = 7F (16) formatu 64-bitowy: 1-1 = 13 = 3FF (16) formatu 8-bitowy: 14-1 = 16383 = 3FFF (16) Największa i najmniejsza wartość liczby w danej reprezentacji: x min = M min B x = M B Emin E max max max Rok akademicki 18/19, Wykład nr 4 39/63 Rok akademicki 18/19, Wykład nr 4 4/63 Standard IEEE 754 Standard IEEE 754 IEEE Std. 754-8 - IEEE Standard for Floating-Point Arithmetic Standard definiuje następujące klasy liczb zmiennoprzecinkowych: Precyzja Pojedyncza (Single Precision, binary3) Pojedyncza rozszerzona (Single Extended) Podwójna (Double Precision, binary64) Podwójna rozszerzona (Double Extended) Długość słowa [bity] Znak [bity] Długość [bity] Wykładnik Zakres Długość [bity] Mantysa Cyfry znaczące 3 1 8 ±17 1 ±38 3 7 43 1 11 ±13 1 ±38 31 1 64 1 11 ±13 1 ±38 5 16 79 1 15 ±16383 1 ±493 63 19 źródło: Gryś S.: Arytmetyka komputerów w praktyce. PWN, Warszawa, 7 (str. 116). W przypadku liczb: pojedynczej rozszerzonej precyzji (ang. Single Precision) podwójnej rozszerzonej precyzji (ang. Double Precision) standard podaje jedynie minimalną liczbę bitów pozostawiając szczegóły implementacji producentom procesorów i kompilatorów Bardzo popularny jest 8-bitowy format podwójnej rozszerzonej precyzji (Extended Precision) wprowadzony przez firmę Intel W 8-bitowym formacie Intela: długość słowa: 8 bitów znak: 1 bit wykładnik: 15 bitów (zakres: ±16383 1 ±493 ) mantysa: 63 bity (cyfry znaczące: 19)
Rok akademicki 18/19, Wykład nr 4 41/63 Rok akademicki 18/19, Wykład nr 4 4/63 Standard IEEE 754 Standard IEEE 754 - liczby 3-bitowe Standard IEEE 754 definiuje także dziesiętne typy zmiennoprzecinkowe (operujące na cyfrach dziesiętnych): decimal3 (3 bity, 7 cyfr dziesiętnych) decimal64 (64 bity, 16 cyfr dziesiętnych) 31 Liczba pojedynczej precyzji przechowywana jest na 3 bitach: S E E E E E E E E MM 4 3 16 15 8 7 MMMMMMMMMMMMMMMMMMMMM decimal18 (18 bitów, 34 cyfry dziesiętnych) znak wykładnik (8 bitów) mantysa (3 bity) Standard IEEE 754 definiuje także: sposób reprezentacji specjalnych wartości, np. nieskończoności, zera sposób wykonywania działań na liczbach zmiennoprzecinkowych sposób zaokrąglania liczb Pierwszy bit w zapisie (bit nr 31) jest bitem znaku ( - liczba dodatnia, 1 - liczba ujemna) Wykładnik zapisywany jest na 8 bitach (bity nr 3-3) z nadmiarem o wartości 17 Wykładnik może przyjmować wartości od -17 (wszystkie bity wyzerowane) do 18 (wszystkie bity ustawione na 1) Rok akademicki 18/19, Wykład nr 4 43/63 Rok akademicki 18/19, Wykład nr 4 44/63 Standard IEEE 754 - liczby 3-bitowe Standard IEEE 754 - liczby 3-bitowe Liczba pojedynczej precyzji przechowywana jest na 3 bitach: Przykład: 31 S E E E E E E E E MM 4 3 16 15 8 7 MMMMMMMMMMMMMMMMMMMMM obliczmy wartość dziesiętną liczby zmiennoprzecinkowej 11111 ( =? IEEE754) znak wykładnik (8 bitów) mantysa (3 bity) Mantysa w większości przypadków jest znormalizowana Wartość mantysy zawiera się pomiędzy 1 a, a zatem w zapisie liczby pierwszy bit jest zawsze równy 1 Powyższy bit nie jest zapamiętywany, natomiast jest automatycznie uwzględniany podczas wykonywania obliczeń Dzięki pominięciu tego bitu zyskujemy dodatkowy bit mantysy (zamiast 3 bitów mamy 4 bity) dzielimy liczbę na części S bit znaku 111 11 E wykladnik określamy znak liczby M mantysa (tylko czesc ulamkowa) S = liczba dodatnia obliczamy wykładnik (nadmiar: 17) 111 = ( ) = 18 + 4 + 1 = 133 E = 133 17 6 nadmiar
Rok akademicki 18/19, Wykład nr 4 45/63 Rok akademicki 18/19, Wykład nr 4 46/63 Standard IEEE 754 - liczby 3-bitowe Standard IEEE 754 - liczby 64-bitowe Przykład (cd.): Liczba podwójnej precyzji przechowywana jest na 64 bitach: wyznaczamy mantysę dopisując na początku 1, (część całkowita) M = 1,11 = = 1 + 1 1 + 1 4 = 1+,5 +,65 = 1,565 wzór na wartość dziesiętną liczby zmiennoprzecinkowej: S E L = ( 1) M podstawiając otrzymujemy: S =, E = 6, M = 1, 565 6 L = ( 1) 1,565 = 1 11111 ( = 1 IEEE754) Pierwszy bit w zapisie (bit nr 63) jest bitem znaku ( - liczba dodatnia, 1 - liczba ujemna) Wykładnik zapisywany jest na 11 bitach (bity nr 6-5) z nadmiarem o wartości 13 Wykładnik może przyjmować wartości od -13 (wszystkie bity wyzerowane) do 14 (wszystkie bity ustawione na 1) Mantysa zapisywana jest na 5 bitach (pierwszy bit mantysy, zawsze równy 1, nie jest zapamiętywany) Rok akademicki 18/19, Wykład nr 4 47/63 Rok akademicki 18/19, Wykład nr 4 48/63 Standard IEEE 754 - zakres liczb Standard IEEE 754 - precyzja liczb Pojedyncza precyzja: największa wartość: 3,4 1 38 najmniejsza wartość: 1,4 1-45 zakres liczb: <-3,4 1 38...-1,4 1-45 > {} <1,4 1-45...3,4 1 38 > Podwójna precyzja: największa wartość: 1,8 1 38 najmniejsza wartość: 4,9 1-34 zakres liczb: <-1,8 1 38...-4,9 1-34 > {} <4,9 1-34...1,8 1 38 > Precyzja - liczba zapamiętywanych cyfr znaczących w systemie 4,8645137846 4,86451-7 cyfr znaczących Precyzja liczby zależy od liczby bitów mantysy Liczba bitów potrzebnych do zakodowania 1 cyfry dziesiętnej: 1 n 1 = n = log 3,3198 Liczba cyfr dziesiętnych (d) możliwa do zakodowania na m bitach: Podwójna rozszerzona precyzja: największa wartość: 1, 1 493 log bitów - 1 cyfra dziesiętna m bitów - d cyfr dziesiętnych d = log m najmniejsza wartość: 3,6 1-4951 zakres liczb: <-1, 1 493...-3,6 1-4951 > {} <3,6 1-4951...1, 1 493 >
Rok akademicki 18/19, Wykład nr 4 49/63 Rok akademicki 18/19, Wykład nr 4 5/63 Standard IEEE 754 - precyzja liczb Standard IEEE 754 - precyzja liczb Dla formatu pojedynczej precyzji: mantysa: 3+1=4 bity cyfry znaczące: 7 Dla formatu podwójnej precyzji: mantysa: 5+1=53 bity cyfry znaczące: 16 4 d = = log Dla formatu podwójnej rozszerzonej precyzji: mantysa: 63+1=64 bity cyfry znaczące: 19 53 d = = log 64 d = = log 4 3,3198 53 3,3198 64 3,3198 = 7,47 7 = 15,9546 16 = 19,659 19 #include <stdio.h> int main() { float x; double y; } float -> 134567936. double -> 13456789. x = 13456789.; /* 1.34.567.89 */ y = 13456789.; /* 1.34.567.89 */ printf("float -> %f\n",x); printf("double -> %f\n\n",y); y = 1345678913456789.; printf("double -> %f\n",y); return ; double -> 13456789134567. Rok akademicki 18/19, Wykład nr 4 51/63 Rok akademicki 18/19, Wykład nr 4 5/63 Standard IEEE 754 - wartości specjalne Standard IEEE 754 - wartości specjalne Zero: Nieskończoność: - zero dodatnie - nieskończoność dodatnia - zero ujemne - nieskończoność ujemna Podczas porównań zero dodatnie i ujemne są traktowane jako równe sobie Nieskończoność występuje w przypadku wystąpienia nadmiaru (przepełnienia) oraz przy dzieleniu przez zero
Rok akademicki 18/19, Wykład nr 4 53/63 Rok akademicki 18/19, Wykład nr 4 54/63 Standard IEEE 754 - wartości specjalne Standard IEEE 754 - wartości specjalne Liczba zdenormalizowana: Nieliczby - NaN (Not A Number) - nie reprezentują wartości liczbowej... x x x x x x x x x x x x... Powstają w wyniku wykonania niedozwolonej operacji znak wykładnik mantysa 1... x x x x x x x x x x x x... znak wykładnik mantysa QNaN (ang. Quiet NaN) - ciche nieliczby... x x 1 1 1 1 1 1 1 x x x x x... x x x x x znak wykładnik mantysa przechodzą przez działania arytmetyczne (brak przerwania wykonywania programu) Pojawia się, gdy występuje niedomiar (ang. underflow), ale wynik operacji można jeszcze zapisać denormalizując mantysę Mantysa nie posiada domyślnej części całkowitej równej 1, tzn. reprezentuje liczbę o postaci,xxx xxx, a nie 1,xxx xxx SNaN (ang. Signaling NaN) - sygnalizujące, istotne, głośne nieliczby x 1 1 1 1 1 1 x x x x x... x x x x x znak... x wykładnik mantysa zgłoszenie wyjątku (przerwanie wykonywania programu) Rok akademicki 18/19, Wykład nr 4 55/63 Rok akademicki 18/19, Wykład nr 4 56/63 Standard IEEE 754 - wartości specjalne Język C - operacje z wartościami specjalnymi Standard IEEE 754 definiuje dokładnie wyniki operacji, w których występują specjalne argumenty #include <stdio.h> #include <math.h> int main() { float x =.; } printf("1./. = %f\n",1./x); printf("-1./. = %f\n",-1./x); printf("./. = %f\n",./x); printf("sqrt(-1.) = %f\n",sqrt(-1.)); printf("1./inf = %f\n",1./(1./x)); printf("*inf = %f\n",.*(1./x)); return ; 1./. = 1.#INF -1./. = -1.#INF./. = -1.#IND sqrt(-1.) = -1.#IND 1./INF =. *INF = -1.#IND Środowisko: Microsoft Visual C++ 8 Express Edition
Rok akademicki 18/19, Wykład nr 4 57/63 Rok akademicki 18/19, Wykład nr 4 58/63 Reprezentacja liczb zmiennoprzecinkowych w C Typy zmiennoprzecinkowe w języku C: Nazwa typu Rozmiar (bajty) Zakres wartości Cyfry znaczące float 4 bajty -3,4 1 38 3,4 1 38 7-8 double 8 bajtów -1,8 1 38 1,8 1 38 15-16 long double 1 bajtów -1, 1 493 1, 1 493 19- Typ long double może mieć także inny rozmiar: Środowisko MS Visual C++ 8 EE Borland Turbo C++ Explorer Dev-C++ Rozmiar (bajty) 8 bajtów 1 bajtów 1 bajtów Reprezentacja liczb zmiennoprzecinkowych w C #include <stdio.h> int main() { float sf =.f; double sd =.; long double slg =.L; int i; } for(i=; i<1; i++) { sf = sf +.1f; sd = sd +.1; slg = slg +.1L; } printf("float: %.f\n",sf); printf("double: %.f\n",sd); printf("long double: %.Lf\n",slg); return ; Rok akademicki 18/19, Wykład nr 4 59/63 Rok akademicki 18/19, Wykład nr 4 6/63 Reprezentacja liczb zmiennoprzecinkowych w C Microsoft Visual C++ 8 Express Edition (long double - 8 bajtów) Liczba 654 jako całkowita i rzeczywista w C int (4 bajty): 654 = A5E (16) float: 1.9557568359 double: 1.145 long double: 1.145 Borland Turbo C++ Explorer (long double - 1 bajtów) float: 1.9557568359375 double: 1.145349 long double: 1.1388 float (4 bajty): 654 = 455E (IEEE 754) Dev-C++ (long double - 1 bajtów) float: 1.9557568359 double: 1.145 long double: -6856473384193541.
Rok akademicki 18/19, Wykład nr 4 61/63 Rok akademicki 18/19, Wykład nr 4 6/63 Język C - nieprawidłowy specyfikator formatu Język C - nieprawidłowy specyfikator formatu int x; printf("x (%%f) = "); scanf("%f",&x); printf("x (%%d) = %d\n",x); printf("x (%%f) = %f\n",x); printf("x (%%e) = %e\n",x); x (%f) = 654 x (%d) = 116118 x (%f) =. x (%e) = 5.73175e-315 float x; printf("x (%%d) = "); scanf("%d",&x); printf("x (%%d) = %d\n",x); printf("x (%%f) = %f\n",x); printf("x (%%e) = %e\n",x); x (%d) = 654 x (%d) = x (%f) =. x (%e) = 3.71946e-4 Zgodnie ze standardem języka C wynik jest niezdefiniowany Zgodnie ze standardem języka C wynik jest niezdefiniowany Zapamiętana wartość: Zapamiętana wartość: Wyświetlona wartość przy wykorzystaniu %d: Wyświetlona wartość przy wykorzystaniu %e: Rok akademicki 18/19, Wykład nr 4 63/63 Koniec wykładu nr 4 Dziękuję za uwagę! (następny wykład: 5.4.19)