C, PHP, VB, .NET

Дневникът на Филип Петров


* Бъг в Windows Calculator?

Публикувано на 13 декември 2011 в раздел Математика.

От около година в интернет пространството е популярна една "грешка" в Windows Calculator, която важи за всички версии след XP включително (а нищо чудно и по-стари). Направете следните стъпки:

  1. Отворете "calc"
  2. Напишете числото 9
  3. Вземете корен квадратен - ще се получи 3
  4. Извадете 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. Отговорът на въпроса "защо става така" тук естествено е по-лесен :)

 



7 коментара


  1. Виждам, че не предизвика интерес. Все пак да си напиша това, което трябваше.

    Това НЕ Е БЪГ в калкулатора, даже напротив - това е нарочно направена "екстра". Накратко: калкулаторът съхранява всички числа с плаваща запетая, но това, което се показва на екрана се закръглява за удобство на потребителя. Така например "корен квадратен от 9" се изписва като "3", но реално в паметта се пази число много близко, но не абсолютно точно равно на 3.

    Е, защо калкулаторът НЕ прави това закръгление, когато отиде при нулата? Ами това всъщност е нарочно действие, с което да уведоми потребителя за това, което описах в предишния параграф. По този начин calc.exe се застрахова от изрази, при които ще се окаже, че е възможно делене на нула.

  2. Щом 3 написано от клавиатурата може да се съхрани точно в паметта, значи и резултата от функцията може. По-скоро ползват алгоритъм за корен с максимална допустима грешка. Като алгоритъма на Нютон.

  3. Може да спира ако стигне 2 поредни итерации да дават едно и също число или число, което не е по-близо до корена от предишното. В калкулатор поне се смятат едно по едно и производителността не е толкова важна.

  4. Е не дават едно и също число. Числените методи винаги водят до някакво приближение. Например колко е "корен от 6"? Можеш да го кажеш до 10, 100, 1000, милионен знак след запетаята... но пак няма да е съвсем точно.

Добави коментар

Адресът на електронната поща няма да се публикува


*