Основно съдържание
Компютрите и интернет
Курс: Компютрите и интернет > Раздел 1
Урок 4: Ограничения при съхранение на числаОграничения на числовите данни, препълване и закръгляване
Когато компютърните програми записват числа в променливи, компютърът трябва да намери начин да представи тези числа в компютърната памет. Компютрите използват различни стратегии в зависимост от това дали числото е цяло или не. Поради ограниченията на компютърната памет, понякога програмите се сблъскват с проблеми като закръгляване, препълване или точност на числовите променливи.
Представяне на цели числа
Цяло число е всяко число, което може да бъде записано без дробна част. Един и същ термин се използва както в програмирането, така и в математиката, така че се надяваме да ти е познат.
Всички тези числа са цели: , , , .
Как език за програмиране може да представи тези цели числа в компютърната памет? Компютрите представят всички данни като битове, така че знаем, че всяко от тези числа, в крайна сметка, е последователност от нули и единици.
За да започнем с нещо просто, представи си компютър, който използва само 4 бита, за да представя цели числа. Може използва първия бит, за да представи знака на цялото число, положителен или отрицателен, а останалите 3 бита - за абсолютната стойност.
В тази система числото едно ще бъде представено по следния начин:
0 | 0 | 0 | 1 |
---|---|---|---|
+/- | |||
знак |
Кое е най-голямото число, което може да представи тази система? Нека попълним всички значещи битове и да проверим:
0 | 1 | 1 | 1 |
---|---|---|---|
+/- | |||
знак |
Това е положителното число , тъй като .
Препълване
Какво ще се случи, ако изпълним програма като тази на 4-битов компютър, в който най-голямото положително число е 7?
var x = 7;
var y = x + 1;
Компютърът може да запише променливата
x
без проблем, но y
е с 1 повече от най-голямото цяло число, което може да се представи с 4 бита. В случаи като този, компютърът може да изведе "грешка от препълване" или да покаже съобщение като "числото е твърде голямо". Може и да изреже резултата (ограничавайки отгоре всички резултати до 7) или да превърти числото (така че 8 става 1). Не искаме да попаднем в нито една от тези ситуации, така че е важно да знаем ограниченията на нашия език и среда, когато пишем програми.
За щастие най-модерните компютри използват 64-битови архитектури, които могат да съхраняват невъобразимо големи числа. В JavaScript най-голямото сигурно цяло число е 9 007 199 254 740 992, равностойно на . Отвъд него сме в опасната зона.
Представяне на плаваща запетая
Видяхме, че има ограничения при записването на цели числа в компютър. Числата, които не са цели, като дробите и ирационалните числа, са още по сложни за представяне в компютърната памет.
Разгледай числа като , , , или известното безкрайно .
Обикновено компютърните езици използват представяне на плаваща запетая за дробни числа (а понякога и за цели числа). Сходно е с "експоненциален запис" – представяне, което може да ти е познато от други обучения.
В представянето чрез плаваща запетая числото се умножава с основа, която е повдигната на степен.
Тъй като компютрите използват двоична вместо десетична система, основата за числа с плаваща запетая е вместо . Поради това числата, които са точна степен на , са най-прости за представяне:
Числата между степените на двойката изглеждат така:
А дробните числа? Отново степените на са най-лесни за представяне.
С плаваща запетая могат да се представят и дроби между степени на 2:
След като компютърът определи представянето с плаваща запетая за дадено число, той го записва в битове. Модерните компютри използват 64-битова система, която използва 1 бит за знака, 11 бита за порядъка и 52 бита за числото отпред.
Тук имаме , представено в двоичен вид с плаваща запетая:
11 111 111 011 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
Точното превръщане в битове е по-сложно отколкото можем да разгледаме тук, но е чудесна тема за теб, ако искаш да навлезеш повече в тази тема.
Грешки от закръгляване
Все пак, представянето с плаваща запетая все още не може да представи всички числа. Разгледай дробното число и неговото представяне с плаваща запетая:
В двоичен вид, е все така безкрайно повтаряща се последователност:
101 010 101…
Не можем да записваме безкрайни последователности в компютър! В един момент компютърът трябва по някакъв начин да завърши числото – или като го отреже, или като го закръгли до най-близкото число с плаваща запетая. Компютрите трябва да правят това сравнително често, тъй като дори дроби като (която е краткото в десетичен вид) са безкрайно повтарящи се последователности, когато са превърнати в двоичен вид.
Често не забелязваме ниската точност на представянето на дадено число, докато не го използваме в операция по пресмятане. Тогава може да ни се случи грешка от закръгляване в резултатите.
✏️ Това е програма, която се опитва да събере . В некомпютърния свят знаем, че резултатът е . Но в компютъра всяка от стойностите е записана като закръглена двоична дроб и когато ги съберем, те не дават точно това, което очакваме като резултат…
Колкото повече битове можем да използваме, толкова по-точни ще са числата и пресмятанията ни. Модерните 64-битови системи предлагат достатъчно висока точност за некритични пресмятания.
Възможно е в даден момент и ти да създаваш програма, която да изчислява резултати от избори, да управлява автомономни автомобили или дори да изстрелва ракети. Когато изчисленията са критични, точността е от значение.
🙋🏽🙋🏻♀️🙋🏿♂️Имаш ли въпроси по темата? Ще се радваме да ти отговорим, просто задай въпросите си по-долу!
Искаш ли да се присъединиш към разговора?
Все още няма публикации.