If you're seeing this message, it means we're having trouble loading external resources on our website.

Ако си зад уеб филтър, моля, увери се, че домейните *. kastatic.org и *. kasandbox.org са разрешени.

Основно съдържание

Ограничения на числовите данни, препълване и закръгляване

Когато компютърните програми записват числа в променливи, компютърът трябва да намери начин да представи тези числа в компютърната памет. Компютрите използват различни стратегии в зависимост от това дали числото е цяло или не. Поради ограниченията на компютърната памет, понякога програмите се сблъскват с проблеми като закръгляване, препълване или точност на числовите променливи.

Представяне на цели числа

Цяло число е всяко число, което може да бъде записано без дробна част. Един и същ термин се използва както в програмирането, така и в математиката, така че се надяваме да ти е познат.
Всички тези числа са цели: 120, 10, 0, minus, 20.
Как език за програмиране може да представи тези цели числа в компютърната памет? Компютрите представят всички данни като битове, така че знаем, че всяко от тези числа, в крайна сметка, е последователност от нули и единици.
За да започнем с нещо просто, представи си компютър, който използва само 4 бита, за да представя цели числа. Може използва първия бит, за да представи знака на цялото число, положителен или отрицателен, а останалите 3 бита - за абсолютната стойност.
В тази система числото едно ще бъде представено по следния начин:
0001
+/-421
знак2, squared2, start superscript, 1, end superscript2, start superscript, 0, end superscript
0 в знаковия бит представя положително число, а 1 в най-десния бит представя 2, start superscript, 0, end superscript (1) място за стойността.
Кое е най-голямото число, което може да представи тази система? Нека попълним всички значещи битове и да проверим:
0111
+/-421
знак2, squared2, start superscript, 1, end superscript2, start superscript, 0, end superscript
Това е положителното число 7, тъй като 2, squared, plus, 2, start superscript, 1, end superscript, plus, 2, start superscript, 0, end superscript, equals, left parenthesis, 4, plus, 2, plus, 1, right parenthesis, equals, 7.
Провери наученото
Представи си компютър, който използва 6 бита, за да представя цели числа: 1 бит за знак и 5 бита за самото число. Кое е най-голямото положително цяло число, което може да представи той?
  • Отговорът ти трябва да бъде
  • цяло число, като 6
  • несъкратима правилна дроб, като 3, slash, 5
  • несъкратима неправилна дроб, като 7, slash, 4
  • смесено число като 1, space, 3, slash, 4
  • точна десетична дроб като 0, point, 75
  • кратно на ПИ като 12, space, start text, p, i, end text или 2, slash, 3, space, start text, p, i, end text

Препълване

Какво ще се случи, ако изпълним програма като тази на 4-битов компютър, в който най-голямото положително число е 7?
var x = 7;
var y = x + 1;
Компютърът може да запише променливата x без проблем, но y е с 1 повече от най-голямото цяло число, което може да се представи с 4 бита. В случаи като този, компютърът може да изведе "грешка от препълване" или да покаже съобщение като "числото е твърде голямо". Може и да изреже резултата (ограничавайки отгоре всички резултати до 7) или да превърти числото (така че 8 става 1).
Не искаме да попаднем в нито една от тези ситуации, така че е важно да знаем ограниченията на нашия език и среда, когато пишем програми.
Провери наученото
В компютър, който използва 6 бита, за да представя цели числа (с един бит за представяне на знака), коя от тези операции ще доведе до препълване?
Избери всички правилни отговори:

За щастие най-модерните компютри използват 64-битови архитектури, които могат да съхраняват невъобразимо големи числа. В JavaScript най-голямото сигурно цяло число е 9 007 199 254 740 992, равностойно на 2, start superscript, 53, end superscript, minus, 1. Отвъд него сме в опасната зона.
✏️ Позабавлявай се в опасната зона по-долу! JavaScript не изписва грешки от препълване, но прави други странни неща.
📝 Виж подобен код в: App Lab | Snap | Python

Представяне на плаваща запетая

Видяхме, че има ограничения при записването на цели числа в компютър. Числата, които не са цели, като дробите и ирационалните числа, са още по сложни за представяне в компютърната памет.
Разгледай числа като 2, slash, 5, 1, comma, 234, 9, comma, 999999, или известното безкрайно pi.
Обикновено компютърните езици използват представяне на плаваща запетая за дробни числа (а понякога и за цели числа). Сходно е с "експоненциален запис" – представяне, което може да ти е познато от други обучения.
В представянето чрез плаваща запетая числото се умножава с основа, която е повдигната на степен.
300, equals, 3, times, start underbrace, 10, end underbrace, start subscript, start text, о, с, н, о, в, а, end text, end subscript, start superscript, start overbrace, 2, end overbrace, start superscript, start text, с, т, е, п, е, н, end text, end superscript, end superscript
Тъй като компютрите използват двоична вместо десетична система, основата за числа с плаваща запетая е 2 вместо 10. Поради това числата, които са точна степен на 2, са най-прости за представяне:
128=127256=128 128 = 1 \cdot 2^7\\ 256 = 1 \cdot 2^8
Числата между степените на двойката изглеждат така:
160=1,2527192=1,5027224=1,7527 160 = 1{,}25 \cdot 2^7\\ 192 = 1{,}50 \cdot 2^7\\ 224 = 1{,}75 \cdot 2^7
А дробните числа? Отново степените на 2 са най-лесни за представяне.
0,50=1210,25=122 0{,}50 = 1 \cdot 2^{-1}\\ 0{,}25 = 1 \cdot 2^{-2}
С плаваща запетая могат да се представят и дроби между степени на 2:
0,750=1,5210,375=1,522 0{,}750 = 1{,}5 \cdot 2^{-1}\\ 0{,}375 = 1{,}5 \cdot 2^{-2}
След като компютърът определи представянето с плаваща запетая за дадено число, той го записва в битове. Модерните компютри използват 64-битова система, която използва 1 бит за знака, 11 бита за порядъка и 52 бита за числото отпред.
Тук имаме 0, comma, 375, представено в двоичен вид с плаваща запетая:
11 111 111 011 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
Точното превръщане в битове е по-сложно отколкото можем да разгледаме тук, но е чудесна тема за теб, ако искаш да навлезеш повече в тази тема.

Грешки от закръгляване

Все пак, представянето с плаваща запетая все още не може да представи всички числа. Разгледай дробното число 1, slash, 3 и неговото представяне с плаваща запетая:
1, slash, 3, equals, 1, comma, start overline, 3, end overline, dot, 2, start superscript, minus, 2, end superscript
В двоичен вид, comma, start overline, 3, end overline е все така безкрайно повтаряща се последователност:
101 010 101…
Не можем да записваме безкрайни последователности в компютър! В един момент компютърът трябва по някакъв начин да завърши числото – или като го отреже, или като го закръгли до най-близкото число с плаваща запетая. Компютрите трябва да правят това сравнително често, тъй като дори дроби като 1, slash, 10 (която е краткото 0, comma, 1 в десетичен вид) са безкрайно повтарящи се последователности, когато са превърнати в двоичен вид.
Често не забелязваме ниската точност на представянето на дадено число, докато не го използваме в операция по пресмятане. Тогава може да ни се случи грешка от закръгляване в резултатите.
✏️ Това е програма, която се опитва да събере 0, comma, 1, plus, 0, comma, 1, plus, 0, comma, 1. В некомпютърния свят знаем, че резултатът е 0, comma, 3. Но в компютъра всяка от стойностите 0, comma, 1 е записана като закръглена двоична дроб и когато ги съберем, те не дават точно това, което очакваме като резултат…
📝 Виж подобен код в: App Lab | Snap | Python
Колкото повече битове можем да използваме, толкова по-точни ще са числата и пресмятанията ни. Модерните 64-битови системи предлагат достатъчно висока точност за некритични пресмятания.
Възможно е в даден момент и ти да създаваш програма, която да изчислява резултати от избори, да управлява автомономни автомобили или дори да изстрелва ракети. Когато изчисленията са критични, точността е от значение.

🙋🏽🙋🏻‍♀️🙋🏿‍♂️Имаш ли въпроси по темата? Ще се радваме да ти отговорим, просто задай въпросите си по-долу!

Искаш ли да се присъединиш към разговора?

Все още няма публикации.
Разбираш ли английски? Натисни тук, за да видиш още дискусии в английския сайт на Кан Академия.