Мысалдар. Қосымша кодтарға сәйкес келетін сандарды жазайық:
а) 0000000000010111. Үлкен разрядта ноль жазылғандықтан нәтиже оң болады. Бұл 23 санының коды.
б) 1111111111000000. Мұнда теріс санның коды жазылған. Алгоритмді орындаймыз:
1) 1111111111000000(2) – 1(2) = 1111111110111111(2);
2) 0000000001000000; 3) 1000000(2) = 64(10).
Жауап: –64.
Дербес компьютердің жадысында нақты сандарды көрсету үшін басқадай тәсіл қолданылады. Жылжымалы үтірлі шамаларды көрсетуді қарастырамыз:
Кез-келген нақты санды M × 10p, где 1 £ M < 10 стандартты түрде жазуға болады, мұндағы 1 £ M < 10, p — бүтін. Мысалы, 120100000 = 1,201 × 108. Ондық санның әр позицицясы көршісінен 10 санының дәрежелеріндей айырмашылығы болатындықтан, 10-ға көбейту ондық үтірді бір позиция оңға жылжытуға эквивалентті. Осылайша 10-ға бөлу ондық үтірді бір позиция солға жылжытуға пара-пар. Сондықтан жоғарыда келтірілген мысалды жалғастыруға болады. 120100000 = 1,201 × 108 = 0,1201 × 109 = 12,01 × 107¼. Ондық үтір санда «жылжиды» және санның бүтін және бөлшек бөліктеріндегі абсолютті орны белгіленбеген.
Жоғарыда келтірілген жазбада М-ді санның матиссасы деп, ал p – оның реті деп аталады. Максималды дәлдікті сақтау үшін есептеуіш машиналар мантиссаны үнемі дерлік нормальданған түрде сақтайды, бұл мантисса осы жағдайда 1(10) и 2(10) (1 £ M < 2).. аралығында жататын сан дегенді білдіреді. Мұнда санау жүйесінің негізі 2 саны. Жылжымалы үтірлі мантиссаны сақтау тәсілі екілік үтірдің бекітілген орында тұрғанын білдіреді. Шын мәнісінде екілік үтір бірінші екілік цифрдан кейін тұрады, яғни, мантиссаны нормальдау бірінші битті жалғыздайды, осымен мәнді 1 мен 2-нің аралығына орналастырады. Жылжымалы нүктелі санға берілген орын екі өріске бөлінеді. Бір өріс мантиссаның таңбасы мен мәнінен тұрады, келесісі ретінің таңбасы мен мәнінен түрады.
Математикалық соопроцессоры бар IBM PC дербес компьютері келесі нақты сандармен жұмыс істеуге мүмкіндік береді (мәндердің диапазоны абсолютті шама бойынша көрсетілген):
Типі
|
Диапазоны
|
Мантиссасы
|
Байттар
|
Real
|
2,9 × 10–39..1,7 × 1038
|
11–12
|
6
|
Single
|
1,5 × 10–45..3,4 × 1038
|
7–8
|
4
|
Double
|
5,0 × 10–324..1,7 × 10308
|
15–16
|
8
|
Extended
|
3,4 × 10–4932..1,1 × 104932
|
19–20
|
10
|
Нақты сандардың ЭЕМ жадысында көрсетілуіне арналған түрлендірулерін Double типті шаманың мысалында көрейік.
Кестеде көрініп тұрғандай, осы типтің шамасы жадыдан 8 байт орын алады. Суретте мантиссаның және реттің өрістерінің көрсетілуі берілген:
S
|
Аралас рет
|
Мантисса
|
63
|
52
|
0
|
Мантиссаға берілген үлкен бит 51-ші нөмір екенін, яғни мантисса 52 биттің кішілерін алады. Сызықша екілік үтірдің орнын көрсетеді. Үтірдің алдында мантиссаның бүтін бөлігінің биті түруы қажет, бірақ ол үнемі 1-ге тең болғандықтан бұл жерде осы бит қажет емес және сәйкесінше жадыда жоқ (бірақ ол ойда). Реттің мәні бұл жерде қосымша кодпен көрсетілген бүтін сан ретінде сақталмайды. Есептеулерді оңайлату және нақты сандарды салыстыру үшін реттің мәні ЭЕМ-де аралас сан ретінде сақталады, яғни, реттің осы мәніне оның жадыға жазылар алдында жылжу қосылады. Жылжу реттің минимальды мәніне ноль сәйкес келетіндей болып таңдалынады. Мысалы, Double типі үшін рет 11 бит орын алады және 2–1023-ден 21023-ге дейінгі диапазонға ие, сондықтан жылжу 1023(10) = 1111111111(2)-ге тең. Сонымен, 63 номерлі бит санның таңбасын кқрсетеді.
Осылайша, жоғарыда айтылғандардан ЭЕМ жадысында нақты сандарды көрсетуді алудың келесі алгоритмі туындайды:
1) берілген санның содулін екілік санау жүйесіне аудару;
2) екілік санды нормальдау, яғни M × 2p, түрінде жазу, мұндағы M — мантисса (оның бүтін бөлігі 1(2)-ге тең) және p —ондық санау жүйесінде жазылған рет;
3) жылжу ретіне қосу және жылжытылған ретті екілік санау жүйесіне аудару;
4) берілген санның таңбасын (0 — оң; 1 — теріс) ескере отырып, оның ЭЕМ жадысында көрсетілуін жазу.
Мысал. –312,3125 санының кодын жаз.
1) Осы санның модулінің екілік жазбасы: 100111000,0101.
2) 100111000,0101 = 1,001110000101 × 28.
3) аралас рет аламыз 8 + 1023 = 1031. Осыдан, 1031(10) = 10000000111(2).
4) Соңғысы
1
|
10000000111
|
0011100001010000000000000000000000000000000000000000
|
63
|
52
|
0
|
Әрине алынған кодты неғұрлым шағын түрде келесідей жазуға болады: C073850000000000(16).
Келесі мысал нақты санның кодынан керісінше санның өзіне өтуді қарастырады.
Мысал. Айталық, келесі код берілсін: 3FEC600000000000(16) немесе
0
|
01111111110
|
1100011000000000000000000000000000000000000000000000
|
63
|
52
|
0
|
1) Алдымен оның оң санның коды екенін байқаймыз, себебі 63 нөмірлі разрядта ноль жазылған. Осы санның ретін алайық: 01111111110(2) = 1022(10); 1022 – 1023 = –1.
2) сан мына түрге ие: 1,1100011 × 2–1 немесе 0,11100011.
3) ондық санау жүйесіне аударып, келесіні аламыз: 0,88671875
Достарыңызбен бөлісу: |