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. mertol каза:

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

  4. mertol каза:

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

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

  6. mertol каза:

    Е това е променлива все пак има лимит на точността.

  7. За това говорим.

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

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


*