Metody numeryczne II. Reprezentacja liczb

Podobne dokumenty
Kod uzupełnień do dwóch jest najczęściej stosowanym systemem zapisu liczb ujemnych wśród systemów binarnych.

Zapis liczb binarnych ze znakiem

Kod U2 Opracował: Andrzej Nowak

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 2 WSTĘP DO INFORMATYKI

Liczby rzeczywiste są reprezentowane w komputerze przez liczby zmiennopozycyjne. Liczbę k można przedstawid w postaci:

Pracownia Komputerowa wykład VI

Reprezentacja stałoprzecinkowa. Reprezentacja zmiennoprzecinkowa zapis zmiennoprzecinkowy liczby rzeczywistej

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

Podstawy Informatyki

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 5 Liczby w komputerze

Wstęp do programowania. Reprezentacje liczb. Liczby naturalne, całkowite i rzeczywiste w układzie binarnym

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Kod IEEE754. IEEE754 (1985) - norma dotycząca zapisu binarnego liczb zmiennopozycyjnych (pojedynczej precyzji) Liczbę binarną o postaci

Przedmiot: Urządzenia techniki komputerowej Nauczyciel: Mirosław Ruciński

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Met Me ody numer yczne Wykład ykład Dr inż. Mic hał ha Łan Łan zon Instyt Ins ut Elektr Elektr echn iki echn i Elektrot Elektr echn olo echn

Pracownia Komputerowa wykład V

Systemy zapisu liczb.

Pracownia Komputerowa wyk ad VI

Teoretyczne Podstawy Informatyki

Metoda znak-moduł (ZM)

Wprowadzenie do informatyki - ć wiczenia

Wielkości liczbowe. Wykład z Podstaw Informatyki dla I roku BO. Piotr Mika

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

Zestaw 3. - Zapis liczb binarnych ze znakiem 1

Wielkości liczbowe. Wykład z Podstaw Informatyki. Piotr Mika

Arytmetyka binarna - wykład 6

Adam Korzeniewski p Katedra Systemów Multimedialnych

System liczbowy jest zbiorem reguł określających jednolity sposób zapisu i nazewnictwa liczb.

Adam Korzeniewski p Katedra Systemów Multimedialnych

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

Technologie Informacyjne Wykład 4

Podstawy Informatyki. Metalurgia, I rok. Wykład 3 Liczby w komputerze

Pracownia Komputerowa wykład IV

Operacje arytmetyczne

Naturalny kod binarny (NKB)

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Kodowanie liczb całkowitych w systemach komputerowych

Arytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI

Zwykle liczby rzeczywiste przedstawia się w notacji naukowej :

Architektura komputerów

SYSTEMY LICZBOWE. SYSTEMY POZYCYJNE: dziesiętny (arabski): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 rzymski: I, II, III, V, C, M

Arytmetyka liczb binarnych

Technologie Informacyjne

Stan wysoki (H) i stan niski (L)

Wprowadzenie do informatyki - ć wiczenia

Pozycyjny system liczbowy

Pracownia Komputerowa wyk ad V

Informatyka 1. Wykład nr 5 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

Metody numeryczne I. Janusz Szwabiński. Metody numeryczne I (C) 2004 Janusz Szwabiński p.1/61

Liczby zmiennoprzecinkowe i błędy

Pracownia Komputerowa wyk ad IV

4 Standardy reprezentacji znaków. 5 Przechowywanie danych w pamięci. 6 Literatura

BŁĘDY OBLICZEŃ NUMERYCZNYCH

Dane, informacja, programy. Kodowanie danych, kompresja stratna i bezstratna

Podstawy Informatyki

Dodatek do Wykładu 01: Kodowanie liczb w komputerze

Metody numeryczne. Janusz Szwabiński. nm_slides.tex Metody numeryczne Janusz Szwabiński 2/10/ :02 p.

Reprezentacja symboli w komputerze. Liczby całkowite i zmiennoprzecinkowe. Programowanie Proceduralne 1

Wstęp do informatyki- wykład 1 Systemy liczbowe

Wprowadzenie do informatyki - ć wiczenia

LICZBY ZMIENNOPRZECINKOWE

Architektura komputerów

Dokładność obliczeń numerycznych

DYDAKTYKA ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE

Podstawy Informatyki. Wykład 2. Reprezentacja liczb w komputerze

Wprowadzenie do metod numerycznych. Krzysztof Patan

Operacje arytmetyczne w systemie dwójkowym

Prefiksy binarne. kibibit (Kibit) mebibit (Mibit) gibibit (Gibit) tebibit (Tibit) pebibit (Pibit) exbibit (Eibit) zebibit (Zibit) yobibit (Yibit)

Kodowanie informacji. Kody liczbowe

Arytmetyka stałopozycyjna

Informatyka 1. Wykład nr 4 ( ) Plan wykładu nr 4. Politechnika Białostocka. - Wydział Elektryczny

1.1. Pozycyjne systemy liczbowe

SYSTEMY LICZBOWE. Zapis w systemie dziesiętnym

Języki i metodyka programowania. Reprezentacja danych w systemach komputerowych

Wstęp do Informatyki

RODZAJE INFORMACJI. Informacje analogowe. Informacje cyfrowe. U(t) U(t) Umax. Umax. R=(0,Umax) nieskończony zbiór możliwych wartości. Umax.

SYSTEMY LICZBOWE 275,538 =

Architektura komputerów Reprezentacja liczb. Kodowanie rozkazów.

Obliczenia Naukowe. O arytmetyce komputerów, Czyli jak nie dać się zaskoczyć. Bartek Wilczyński 29.

Informatyka 1. Wykład nr 4 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Pracownia komputerowa. Dariusz Wardecki, wyk. VI

Kodowanie liczb. Reprezentacja liczb całkowitych. Standard IEEE 754. dr inż. Jarosław Forenc

Cyfrowy zapis informacji

EMN. dr Wojtek Palubicki

Techniki multimedialne

Arytmetyka stało- i zmiennoprzecinkowa. 1. Informacje wstępne

Arytmetyka stało i zmiennoprzecinkowa

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

2018 Marcin Kukliński. Niesforne bity i bajty

1. Operacje logiczne A B A OR B

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

architektura komputerów w. 2

Wstęp do informatyki. Pojęcie liczebności. Zapis liczb. Liczenie bez liczebników. Podstawy arytmetyki komputerowej. Cezary Bolek

Plan wyk ladu. Kodowanie informacji. Systemy addytywne. Definicja i klasyfikacja. Systemy liczbowe. prof. dr hab. inż.

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Transkrypt:

Metody numeryczne II. Reprezentacja liczb Oleksandr Sokolov Wydział Fizyki, Astronomii i Informatyki Stosowanej UMK (2016/17) http://fizyka.umk.pl/~osokolov/mnii/

Reprezentacja liczb Reprezentacja stałopozycyjna 13, -145.23 Reprezentacja stałopozycyjna operuje na ustalonej liczbie cyfr ułamkowych wszystkie liczby rzeczywiste skraca się do t cyfr ułamkowych. Reprezentacja zmiennopozycyjna mantysa i cecha, liczba = mantysa 10 cecha 18.5=0.185 10 2 =1.85 10 1 =185 10-1 Cecha wskazuje miejsce kropki w zapisie liczbowym Reprezentację zmiennopozycyjną liczby x oznaczamy rd(x)

Typy danych liczbowych W języku C wyróżniamy następujące typy zmiennych ( wg wielkości ) : 3 podstawowe : int- typ całkowity, o długości domyślnej dla danej architektury komputera; float - typ zmiennopozycyjny (zwany również zmiennoprzecinkowym), reprezentujący liczby rzeczywiste (4 bajty); Są dokładnie opisane w IEEE 754. double - typ zmiennopozycyjny podwójnej precyzji (8 bajtów); GNU Multiple Precision Arithmetic Library (lub GMP)[1] - biblioteka programistyczna udostępniająca liczby całkowite, wymierne i zmiennoprzecinkowe o dowolnej precyzji. Wewnętrzny format danych jest binarny.

Reprezentacja stałoprzecinkowa Wady reprezentacji stałoprzecinkowej (Fixed Point Notation): A 47567.31 B 0.000075244 10-cyfrowy format: XXXXX.XXXXX A 47567.31000 B 0.000075244 obcięte 00000.00007 W przypadku liczb stałoprzecinkowych wystąpi duży błąd przy bardzo małych wartościach oraz bardzo dużych wartościach (w odniesieniu do powyższego formatu).

Reprezentacja stałoprzecinkowa (cd.) Kody stałopozycyjne mają ustalone miejsce rozdziału części całkowitej i ułamkowej, czyli miejsce przecinka, co oznacza, że dokładność reprezentacji jest stała. Aby mówić o arytmetyce stałoprzecinkowej trzeba wiedzieć, w jaki sposób zapisywane są liczby dodatnie i ujemne. Dla reprezentacji liczb dodatnich i ujemnych najpowszechniej stosowane są trzy kody: kod znak moduł (ZM) kod uzupełnienia do jednego (U1) kod uzupełnienia do dwóch (U2)

Zapis w systemie ZM Kod ZM jest tworzony przez dodanie bitu znaku na początku każdej liczby, który wskazuje czy liczba jest dodatnia czy ujemna. Przyjęło się, że gdy liczba jest ujemna bit jest równy 1 a dalsze bity reprezentują moduł liczby. Gdy liczba jest dodatnia to bit znaku jest równy 0. Za pomocą n-bitowego słowa można przedstawić liczby z zakresu: gdzie n ilość bitów liczby. Na przykład za pomocą 8-bitowego słowa można przedstawić liczby z zakresu 127 do 127. Liczba 34 (10) =00100010, a liczba -34 (10) =10100010. Kod ZM ma wadę która stwarza problemy przy realizacji algorytmów arytmetycznych, jest to podwójna reprezentacja liczby zero. Dla słowa 8-bitowego jest to liczba 00000000, jak i 10000000.

Przykład

Stałoprzecinkowe liczby ZM Po przecinku wagi pozycji są kolejnymi ujemnymi potęgami podstawy Zakres dwójkowych liczb stałoprzecinkowych 110101,111011 (2). 110101 (2) = 32 + 16 + 4 + 1 = 53 (10) 0,111011 (2) = 1/2 + 1/4 + 1/8 + 1/32 + 1/64 0,111011 (2) = 32/64 + 16/64 + 8/64 + 2/64 + 1/64 0,111011 (2) = 59/64 110101,111011 (2) = 53 59 / 64 Sposób drugi. 111011 (2) = 32 + 16 + 8 + 2 + 1 = 59 Waga ostatniej pozycji wynosi 1/64

Arytmetyka liczb ZM W działaniach uczestniczą tylko moduły liczb. Bity znaków pełnią różne funkcje decyzyjne, które opisaliśmy w poniższych tabelkach.

Arytmetyka liczb ZM (cd) Ponieważ liczby zapisane w systemie ZM posiadają ustalony format (ilość bitów jest stała), to przy wykonywaniu operacji arytmetycznych może dochodzić do nadmiarów (wynik większy niż można przedstawić za pomocą dostępnych bitów modułu) niedomiarów. Przy dodawaniu i odejmowaniu wg opisanych reguł dla liczb ZM nadmiar (niedomiar) można wykryć, jeśli wystąpiło przeniesienie (lub pożyczka) na pozycję znakową. 11111111 (2) + 00000001 (2) = 1 00000000 (2) (255 + 1 = 0) Zwykle kompilatory języków programowania posiadają opcję włączenia sprawdzania zakresów wyników operacji arytmetycznych na liczbach całkowitych Sytuacja taka nazywa się niedomiarem (ang. underflow) i występuje zawsze, gdy wynik operacji arytmetycznej jest mniejszy od dolnego zakresu formatu liczb binarnych (np. 0)

Zapis w systemie uzupełnień do 1 - U1 1C - One's Complement Format liczby U1 jest ustalony z góry - liczba zawiera określoną ilość bitów. W systemie tym wszystkie bity zapisu liczby posiadają swoje wagi (w ZM bit znaku nie posiadał wagi). Najstarszy bit jest bitem znaku i ma wagę równą (-2 n-1 +1), gdzie n oznacza ilość bitów w zapisie liczby. Pozostałe bity posiadają wagi takie jak w naturalnym systemie dwójkowym. Zakres n bitowej liczby w kodzie U1 wynosi

Przykład Liczba przeciwna zawsze powstaje w kodzie U1 przez negację wszystkich bitów Jeśli liczba jest dodatnia, to najstarszy bit znakowy posiada wartość 0. Pozostałe bity służą do zapisu liczby w naturalnym kodzie binarnym: Jeśli liczba jest ujemna, to najstarszy bit znakowy ma wartość 1. Pozostałe bity są negacjami bitów modułu wartości liczby:

Arytmetyka liczb U1 Jeśli występuje przeniesienie poza bit znaku, to do wyniku należy dodać 1, aby otrzymać poprawny rezultat dodawania. Liczby U1 mogą być liczbami stałoprzecinkowymi. W przypadku dodawania takich liczb przeniesienie poza bit znaku dodawane jest do najmłodszej cyfry wyniku. Odejmowanie realizujemy za pomocą dodawania liczby przeciwnej. Liczbę przeciwną tworzymy w kodzie U1 negując wszystkie bity zapisu liczby.

Zapis w systemie uzupełnień do 2 U2 System zapisu U1 umożliwia w prosty sposób kodowanie liczb ujemnych. Jednakże wykonywanie operacji arytmetycznych wciąż wymaga dodatkowych założeń - przy dodawaniu do wyniku należy dodać przeniesienie poza bit znaku, aby otrzymać poprawny wynik. Zmieniamy wagę bitu znakowego z (-2 n-1 + 1) na (-2 n-1 ), gdzie n oznacza ilość bitów w formacie kodu U2. Bit znakowy posiada wagę ujemną, lecz o wartości bezwzględnej takiej samej jak w naturalnym kodzie dwójkowym. Nowy kod nosi nazwę uzupełnień do podstawy 2 lub w skrócie U2 (ang. 2C - Two's Complement). Zakres n bitowej liczby w kodzie U2 wynosi

Przykład W tym systemie wartość 0 ma tylko jedną reprezentację 0000, a liczb ujemnych jest o 1 więcej niż dodatnich (-8.. -1, 1.. 7). Najstarszy bit określa znak liczby. Jeśli jest równy 0, liczba jest dodatnia i resztę zapisu możemy potraktować jak liczbę w naturalnym kodzie dwójkowym. Jeśli bit znaku ustawiony jest na 1, to liczba ma wartość ujemną. Bit znaku ma wagę (-2 n-1 ), gdzie n oznacza liczbę bitów w wybranym formacie U2. Reszta bitów jest zwykłą liczbą w naturalnym kodzie dwójkowym. Wagę bitu znakowego i wartość pozostałych bitów sumujemy otrzymując wartość liczby U2: Postać ujemna liczby U2 nie jest już tak czytelna dla nas jak w przypadku kodów ZM (tylko zmiana bitu znaku) i U1 (negacja wszystkich bitów).

Przykład (cd) Procedura wyznaczania liczby przeciwnej w kodzie U2 1. Dokonać negacji wszystkich bitów zapisu liczby U2. 2. Do wyniku dodać 1. 01101110 (U2). (-8) (10) = 1000 (U2) ; NOT(1000) = 0111; 0111 + 0001 = 1000, a to jest ta sama liczba wyjściowa. Wyznaczyć 8-mio bitowy kod U2 dla liczby dziesiętnej 27 (10). Wyznaczyć 8-mio bitowy kod U2 dla liczby dziesiętnej (-45) (10). Dodajemy bit znaku równy 1 i otrzymujemy:

Stałoprzecinkowe liczby U2 Zapis U2, podobnie jak zapisy NBC, ZM i U1, można rozszerzyć do zapisu stałoprzecinkowego dodając bity o wagach ułamkowych równych kolejnym, ujemnym potęgom podstawy 2. Obliczamy liczbę przeciwną do 1101,1001 (U2) = (-2 7 / 16 )

Arytmetyka liczb U2 System zapisu U2 liczb ze znakiem jest dzisiaj powszechnie stosowany we wszystkich komputerach IBM, Amiga, Macintosh i innych, ponieważ jego arytmetyka jest bardzo zbliżona do arytmetyki liczb w naturalnym kodzie binarnym. System uzupełnień do podstawy wymyślił znany francuski uczony Blaise Pascal. Otóż skonstruował on prostą maszynę arytmetyczną, która potrafiła dodawać liczby dziesiętne. Aby również umożliwić wykonywanie odejmowania, Pascal dodawał liczby uzupełnione do podstawy 10. Na przykład załóżmy, iż Pascal chciał wykonać odejmowanie 84-55. W tym celu tworzył uzupełnienie dziesiętne liczby 55, które dla liczb dwucyfrowych jest równe (dla 3 cyfrowych odejmujemy od 1000, dla n-cyfrowych odejmujemy od 10n) : 100-55 = 45 Otrzymaną liczbę dodawał na swojej maszynie do liczby 84 i dostawał wynik: 84 + 45 = 129 Ignorował najstarszą cyfrę, zatem pozostawało 29, a to jest wynik różnicy: 84-55 = 29 Zaletą tego systemu było to, iż uzupełnienie liczby można dosyć łatwo obliczać. Na tej właśnie podstawie skonstruowany jest system U2 - uzupełnienie do podstawy 2.

Arytmetyka liczb U2 (cd) Liczby U2 dodajemy i odejmujemy wg poznanych zasad dla naturalnego systemu dwójkowego. Przeniesienia poza bit znaku ignorujemy Mnożenie liczb w kodzie U2 różni się nieco od standardowego mnożenia liczb binarnych. Przed wykonaniem tej operacji arytmetycznej musimy rozszerzyć znakowo obie mnożone liczby tak, aby ich długość (liczba bitów) wzrosła dwukrotnie (jeśli są różnej długości, to rozszerzamy znakowo względem dłuższej liczby). Rozszerzenie znakowe polega na powielaniu bitu znaku na wszystkie dodane bity.

Nadmiar i niedomiar w kodzie U2 Cechą charakterystyczną nadmiaru/niedomiaru jest zmiana znaku wyniku w sytuacji, gdy nie powinna ona nastąpić. Wystąpienie nadmiaru lub niedomiaru jest wskazówką dla programisty, iż źle dobrał typ danych dla przetwarzanej informacji - liczby są reprezentowane zbyt małą ilością bitów i nie można poprawnie zapisywać wyniku operacji. Najprostszym rozwiązaniem będzie zwiększenie długości formatu U2

Zapis zmiennopozycyjny Z zapisem zmiennoprzecinkowym można spotkać się w przypadkach, gdzie przy jego pomocy przedstawia się albo bardzo duże wartości, albo bardzo małe. Zapis ten nazywa się często notacją naukową, np.: Gwiazda Proxima Centauri znajduje się w odległości 9460800000000 [km], czyli 9,4608 * 10 12. Masa elektronu wynosi m e = 0,00000000000000000000000000091095 [g], czyli 9,1095 x 10-28 [g]

Postać znormalizowana liczby U e L d t i d d d d d x i e t t 1 0 1 1,..., 1, 0... 0 1 1 2 2 1 0 10 2 8 16 Standardy

Zadanie Pobudować układ 2, L 1, U 1, t 3

Cechy liczb zmiennopozycyjnych Ilość możliwych wartości 2 1 1 t U L 1 1 Najmniejsza wartość Underflow level UFL L Największa wartość Overflow level OFL U 1 1 t

Zaokrąglenia obcięcie e t t t d t d d d d x 1 1 2 2 2 2 1 0... e t d t d d d x fl 2 2 2 2 1 0... ) ( Zaokrąglenie do najbliższej e t t e t t d d d d d d d d x fl 2 2 2 2 1 0 2 2 2 2 1 0 1...... ) (

Epsilon maszynowy Obcięcie Zaokrąglenie do najbliższej 1t 1 1t 2 1 1 et, e e 1 równomiernie

Własności arytmetyki zmiennoprzecinkowej Arytmetyka zmiennoprzecinkowa nie jest łączna. To znaczy, że dla x, y i z mogą zachodzić różności: Nie jest też rozdzielna, czyli może zachodzić różność: Innymi słowy, kolejność wykonywania operacji wpływa na końcowy wynik. Przy obliczeniach zmiennoprzecinkowych występują też: zaokrąglenia nieprawidłowe operacje przepełnienie niedomiar

Arytmetyka zmiennopozycyjna Dodawanie i odejmowanie Załóżmy że chcemy dodać lub odjąć dwie dodatnie liczby zmiennoprzecinkowe: Jeśli liczby mają różne wykładniki, to podczas dodawania mantysa liczby o mniejszym wykładniku musi zostać zdenormalizowana Mnożenie i dzielenie

Błędy operacji elementarnych Wynik działań zmiennopozycyjnych można traktować jako wynik dokładnych działań wykonanych na zaburzonych danych wejściowych. Reprezentację zmiennopozycyjną liczby x oznaczamy rd(x)

Błędy operacji elementarnych (cd) Reprezentację zmiennopozycyjną liczby x oznaczamy rd(x) Wartość wyrażenia w arytmetyce zmiennopozycyjnej fl(wyrażenie) Układ dwójkowy

Przykład Dodawanie z siedmiocyfrowymi mantysami Sposób A Sposób B

Ważne! Nie jest spełnione prawo łączności dodawania w obliczeniach zmiennopozycyjnych

Przykład mantysa jest reprezentowana na d bitach błędy reprezentacji wynoszą

Sposób 1

Sposób 2

Algorytm numerycznie stabilny i poprawny Niestabilność numeryczna powstaje wówczas, kiedy mały błąd numeryczny w trakcie dalszych obliczeń powiększa się (np. przemnaża się) i powoduje duży błąd wyniku.

Algorytm 1

Algorytm 1(cd)

Algorytm 2

Algorytm 2 (cd)

Stabilność a poprawność Maksymalny przewidywalny błąd wynikły wyłącznie z przeniesienia błędu reprezentacji danych na wynik obliczeń nazywamy optymalnym poziomem błędu danego zadania w arytmetyce t- cyfrowej. Algorytm stabilny gwarantuje otrzymanie wyniku akceptowanego z poziomem błędu tego samego rzędu, co optymalny poziom błędu. Rozwiązanie obliczone algorytmem numerycznie poprawnym jest nieco zaburzonym rozwiązaniem zadania o nieco zaburzonych danych, tzn. jeśli dane są obarczone błędem, to i wynik jest obarczony porównywalnym błędem. Stabilność jest minimalną własnością, jakiej wymagamy od algorytmu, poprawność - maksymalną własnością jakiej możemy oczekiwać od zastosowanego algorytmu

Standard IEEE-754 Reprezentacja zmiennoprzecinkowa IEEE-754 single https://pl.wikipedia.org/wiki/ieee_754

Przykład

Przykłady

Zapis 10-tej liczby 12.375 0.375 x 2 = 0.750 = 0 + 0.750 => b 1 = 0, 0.750 x 2 = 1.500 = 1 + 0.500 => b 2 = 1 (0.375) 10 (0.011) 2 0.500 x 2 = 1.000 = 1 + 0.000 => b 3 = 1, (12.375) 10 = (12) 10 + (0.375) 10 = (1100) 2 + (0.011) 2 = (1100.011) 2 127 = 0111 1111 130 = 1000 0010

Zadania 1 10 0.25 10 0.375 10

Odpowiedzi 127 = 0111 1111 0 = 000...0 0-01111111-00000000000000000000000 = 3f800000 H 127+( 2)= 125 = 0111 1101 0 = 000...0 0-01111101-00000000000000000000000 = 3e800000H 127+( 2)= 125 = 0111 1101 1 = 10000..0 0-01111101-10000000000000000000000 = 3ec00000H

Z 2-go do 10-tej 41c8 0000 16 = 0100 0001 1100 1000 0000 0000 0000 0000 2 Sign bit: 0 Exponent: 1000 0011 2 = 83 16 = 131 131 127 = 4 Significand: 100 1000 0000 0000 0000 0000 2 = 480000 16 23 20 1 + 0.5 + 0.0625 = 1.5625 1.5625 2 4 = 25 41c8 0000 = 25 bit 23 = 0.5 bit 22 = 0.25 bit 21 = 0.125 bit 20 = 0.0625 bit 19 = 0.03125.. bit 0 = 0.00000011920928955078125

Przykłady 3f80 0000 = 0 01111111 00000000000000000000000 = 1 c000 0000 = 1 10000000 00000000000000000000000 = 2 3eaa aaab = 0 01111101 01010101010101010101011 1/3 7f7f ffff = 0 11111110 11111111111111111111111 = (1 2 24 ) 2 128 3.402823466 10 38 (max finite positive value in single precision) 0080 0000 = 0 00000001 00000000000000000000000 = 2 126 1.175494351 10 38 (min normalized positive value in single precision) 0000 0000 = 0 00000000 00000000000000000000000 = 0 8000 0000 = 1 00000000 00000000000000000000000 = 0 7f80 0000 = 0 11111111 00000000000000000000000 = infinity ff80 0000 = 1 11111111 00000000000000000000000 = infinity

Cechy standardu

Standard IEEE-754. Reprezentacja bitowa

Przykład Przekształcamy liczbę dziesiętną do postaci dwójkowej: Otrzymaną liczbę normalizujemy: pomijamy wiodącą jedynkę w mantysie 01011 obliczamy wykładnik 2 + 127 = 129 10000001

Przykład

Przykłady prefiks 0x wskazuje, że liczba jest napisana w kodzie szesnastkowym

Reprezentacja liczb specjalnych Not a Number

Standard IEEE-754. Wartości specjalne

Standard IEEE-754. Operacje specjalne

Implementacje w C++

Niedokładności Wiele dziwnych na pierwszy rzut oka wyników bierze się stąd, że obliczenia zmiennopozycyjne wykonywane są w bazie B = 2, natomiast na zewnątrz liczby reprezentowane są najczęściej w bazie B = 10. Dlatego pisząc w kodzie programu np. x=0.01 intuicyjnie oczekujemy, że liczba 0,01 będzie reprezentowana dokładnie, a tak niestety nie jest. Aby się o tym przekonać, rozważmy następujący program: Ponieważ liczba 0, 01 nie ma dokładniej reprezentacji w standardzie IEEE, przybliżana jest najbliższą liczbą maszynową (czyli taką, która daje się przedstawić dokładnie). Dlatego równość nie jest spełniona.

Niedokładności (c.d.) Po wykonaniu tego programu znowu okaże się, wbrew oczekiwaniom wielu początkujących numeryków, że wartości zmiennych z i z1 nie są równe. Podobnie, jak w poprzednim przykładzie, przyczyną jest to, że y = 1.0/7.0 nie ma dokładniej reprezentacji w standardzie IEEE.

Niedokładności (c.d.) Liczba 1000, 0 ma dokładną reprezentację zmiennopozycyjną, natomiast 1000, 2 daje się przedstawić tylko w przybliżeniu. Dlatego komputerowy wynik powyższego działania będzie się różnił trochę od wartości dokładnej 0, 2:

Rozszerzona precyzja Rodzina procesorów Intela należy do systemów o rozszerzonej precyzji (ang. extended-based systems), które wewnętrznie zapisują liczby z dokładnością większą, niż wymaga tego używany typ danych. Pozwala to na ogół liczyć dokładniej niż na architekturach pozbawionych tej właściwości (np. większość procesorów RISC), czasami prowadzi jednak do pewnych niepożądanych efektów ubocznych: Iloraz a/b liczony jest w rozszerzonej precyzji. Wynik zostaje przekształcony do pojedynczej precyzji i zapamiętany w zmiennej c. Jeżeli przy tym przekształceniu następuje utrata dokładności, z będzie raczej różne od zera:

Porównywanie liczb zmiennopozycyjnych OS2.c # include "stdio.h" int main () { float x =3.0/7.0; if ( x ==3.0/7.0) printf( " Równe :)\ n " ); else printf( " Nierówne :(\ n ") ; } Powodem takiego zachowania programu jest znowu rozszerzona precyzja, z jaką liczby przechowywane są w wewnętrznych rejestrach i jej utrata przy konwersji na typ używany w programie. Dlatego należy unikać bezpośrednich porównań liczb zmiennoprzecinkowych, a jeżeli algorytm wymaga od nas takiego porównywania, bezpieczniej jest traktować liczby jako równe, jeżeli moduł ich różnicy jest mniejszy od małej, z góry zadanej wartości:

Denormalizacja >> x =10^10; y = x ; z =1/ x ; >> x+z-y ans = 0 >> x-y+z ans = 1.0000e-10 Chociaż oba wyrażenia są matematycznie równoważne, dają numerycznie różne wyniki. Przyczyną jest znowu skończona ilość bitów w mantysie. Jeżeli dodajemy do siebie dwie liczby o różnych wykładnikach, muszą one zostać sprowadzone do wspólnej cechy. Na ogół odbywa się to przez denormalizację mniejszej z liczb. Jeżeli rzędy tych liczb różnią się od siebie o więcej niż 52 bity, wówczas w procesie denormalizacji mniejsza liczba zostanie zastąpiona zerem. Tak jest w pierwszym z powyższych wyrażeń.

Przykład. Utrata cyfr znaczących

Przykład #include "stdio.h" int main(int argc, char *argv[]) { float a, b, f; a=123456789; b=123456788; f=a-b; printf("result: %f\n", f); return 0; } 123456789 =4CEB79A3hex(ieee)=123456792(dec) 123456788 =4CEB79A2hex(ieee)=123456784(dec) http://www.h-schmidt.net/floatconverter/ieee754.html

The first 2398 decimal digits of π