Преди година и нещо зададох въпроса дали компютрите могат да смятат. Тогава дадох един на пръв поглед засукан пример, а накрая предложих тест с безумно малко число. Който е пробвал се е убедил, че отговорът на въпроса е „не, … поне не във всички случаи“. Днес (ако трябва да сме точни – тази вечер) ще ви дам друг пример. Пример, който е някак … човешки и разбираем. Или поне така изглежда.
Добре, нека оставим изчислението на орбитите на планети и спътници на НАСА. Да си спомним какво сме учили в училище. В много лични разговори задавам въпроса: „Кое число е по-хубаво – една трета или една десета?“ Понякога се налага да побутна хората и им напомня, че 1/3 = 0,3333… и така до безкрай, а калкулатора им има ограничен брой цифри. Тогава хората решават, че 1/10 е хубаво число защото е равно на скромното и семпло 0,1. Е да, ама не.
Нека X=0,1+0,1+0,1+ … +0,1 като имате общо десет събираеми. На колко е равно? Човешкият ви разум правилно ще заключи – на 1. Ако накарате компютър да го изчисли директно, най-вероятно ще получите също единица. Например:
var x: Double; begin x:=0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1; end.
Но това се дължи на оптимизация от страна на компилатора ви. Компилаторът ви например може да е засякъл, че може да произведе по-бърз машинен код като упрости израза. Ако не знаете какво е компилатор – това е една програма, която привежда горния текст в разбираем за компютъра (и операционната ви система) вид. С други думи – програма която прави програми. Опитайте сега да изпълните изчислението на стъпки. Например
var x,Step: Extended; i: LongInt; begin x:=0; Step:=0.1; for i:=1 to 10 do x:=x+Step; end.
На колко е равно x? Едно ли? Другия път …
Вижте също:
Предполагам получаваш 0.9 на последното смятане?
Боян Пейчев
24 окт 09 at 17:54
О, не – цикълът се върти от 1 до 10 включително. Демек повторенията са си колкото трябва – 10.
Ти колко получи? Обаче искам сравнение if (x=1) или изход abs(x-1) …
Георги Фурнаджиев
24 окт 09 at 19:32