Brouzdej.cz


Přečtěte si: všechno | články | krátce





Doporučujeme: vyhrajte reklamní USB flash disky podle vašeho vlastního návrhu.

Máme řešení hádanky Ivo Lukačoviče

Ivo Lukačovič zveřejnil na svém blogu hádanku. Poslal jsem odkaz na jeho weblog svému bráchovi a ten mi před několika okamžiky poslal řešení. Zajímá vás, kde je podle bráchy chyba v programu? Pokud chcete luštit, luštěte dál. Správnou odpověď zveřejní Ivo Lukačovič za několik dnů. Jestli si nechcete namáhat hlavu, podívejte se do tohoto zápisku.

Jen připomínám, že si Ivo Lukačovič zadal do Reflexu a Týdne inzerát portálu Seznam.cz a v něm zveřejnil hádanku v jazyce C++.

Můj brácha Pavel "Lordhp" Ptáček se v C++ vyzná. Je to jeden z těch mladých nadějných programátorů. Ve svých patnácti letech napsal redakční systém pro Brouzdej.cz. Teď je zase mnohem dál a já si k němu chodím pro rozumy.

Jaké je tedy řešení hádanky? Předávám slovo bráchovi:
Program se zacyklí, ačkoli to na první pohled nevypadá. Typ double totiž pracuje s dvěmi částmi čísla - teď si přesně nevzpomenu na označení - kdy první část mi udává nějaké číslo a ta druhá udává na kolikátou se má dané číslo umocnit.

Z tohoto důvodu dochází k nepřesnostem při matematických operacích s desetinnými čísly typu double. Z tohoto důvodu pokud postupné odečítání podmíníme rovností (a sice že odečítání skončí pokud bude X přesně 0.01) pak nutně musí dojít k zacyklení. Proto je nutné výraz

while(x != 0.01)

nahradit výrazem

while(x > 0.01)

přičemž >= použít nemůžeme protože cyklus by měl skončit neprodleně po dosažení hodnoty 0.01.

Tento fakt si můžete sám ověřit pokud si napíšete aplikaci která bude mít podmínku x > -1. Pak, v pozici kde by měla být nula, nulu ovšem neuvidíte, ale na jejím místě se bude nacházet číslo s hodně jemnou hodnotou (avšak ne nulou).


Nerozuměli jste ničemu? Nevadí. Jsem na tom podobně :-).

| Radim Hasalík







ABC Brouzdej ; blog @ brouzdej.cz | Přihlásit se Vytvořil Pavel Ptáček © 2003 - 2005 ( o webu ) | Hostováno u FORPSI | Doporučujeme: webmaster tools