* Бъг в Windows Calculator?
Публикувано на 13 декември 2011 в раздел Математика.
От около година в интернет пространството е популярна една "грешка" в Windows Calculator, която важи за всички версии след XP включително (а нищо чудно и по-стари). Направете следните стъпки:
- Отворете "calc"
- Напишете числото 9
- Вземете корен квадратен - ще се получи 3
- Извадете 3 - очаквате отговор 0... но
Отговорът ще е... 1.1546388020691628168216106791278e-37 или подобно в зависимост от версията на калкулатора. Този проблем не е само с 9, а всички точни корени. Например последователността "16 -> sqrt -> - 4" също ще даде на пръв поглед абсурден резултат.
Проблемът естествено идва от закръгляването от число с плаваща запетая до цяло число. Когато вземете корен квадратен от 9 ви се изписва 3, но "зад кулисите" стои число с плаваща запетая, което е много близко, но не абсолютно точно равно на 3.
Интересното обаче е, че проблемът идва само и единствено при изваждане до нула. Ако например направите "9 -> sqrt -> - 2" отговорът коректно ще излезе числото "1".
Защо Windows Calculator не закръглява когато трябва да бъде към 0? Това "бъг" ли е или е направено нарочно?
П.П. И още един интересен "феномен". Копирайте "2+2*2=" и направете "Edit > Paste" в калкулатора. В "Standard" режим ще върне отговор 8, а в "Scientific" ще върне 6. Отговорът на въпроса "защо става така" тук естествено е по-лесен :)
Виждам, че не предизвика интерес. Все пак да си напиша това, което трябваше.
Това НЕ Е БЪГ в калкулатора, даже напротив - това е нарочно направена "екстра". Накратко: калкулаторът съхранява всички числа с плаваща запетая, но това, което се показва на екрана се закръглява за удобство на потребителя. Така например "корен квадратен от 9" се изписва като "3", но реално в паметта се пази число много близко, но не абсолютно точно равно на 3.
Е, защо калкулаторът НЕ прави това закръгление, когато отиде при нулата? Ами това всъщност е нарочно действие, с което да уведоми потребителя за това, което описах в предишния параграф. По този начин calc.exe се застрахова от изрази, при които ще се окаже, че е възможно делене на нула.
Разбира се, че корен квадратен се изчислява чрез алгоритъм с определен, но не безкраен брой итерации.
Щом 3 написано от клавиатурата може да се съхрани точно в паметта, значи и резултата от функцията може. По-скоро ползват алгоритъм за корен с максимална допустима грешка. Като алгоритъма на Нютон.
Може да спира ако стигне 2 поредни итерации да дават едно и също число или число, което не е по-близо до корена от предишното. В калкулатор поне се смятат едно по едно и производителността не е толкова важна.
Е не дават едно и също число. Числените методи винаги водят до някакво приближение. Например колко е "корен от 6"? Можеш да го кажеш до 10, 100, 1000, милионен знак след запетаята... но пак няма да е съвсем точно.
Е това е променлива все пак има лимит на точността.
За това говорим.