Na Internetu už rok zuří flame war o to, jaké je správné řešení příkladu 48:2(9+3), zda 288, anebo 2, nebo v jednodušší podobě, kde není tolik počítání: 6:2(1+2), tedy 9, anebo 1. I kalkulačky s tím mají problémy.
Příčina? Zastaralé znaménko dělení a nejednoznačnost významu závorky. V normální mathematice se znaménko dělení: „÷“ či v ČR absurdně „:“ nepoužívá. Místo toho se píší zlomky. Ty jsou jednoznačné.
Druhý problém je význam závorky. Ačkoliv je jasně definováno, že závorka má význam pouze pro výraz uvnitř, někteří ji exportují i ven. Proto vidí rozdíl mezi 6:2(3) a 6:2.3. Myslí, že zrušit závorku má přednost před jakouliv jinou operací. Jenže nemá. 6:2(3) a 6:2.3 je to samé a řešení je 9, respektive v prvním zadání 288.
Proč to špatně spočítají i vědecké kalkulačky? Na vině je implicitní násobení. Zápis 1:2x každý vyhodnotí jako 1/(2.x), ačkoliv správně má být (1/2).x. A kalkulačky to mají vinou obtížnosti zobrazovat zlomky stejně.
Řešili jsme na Technetu, diskuze stojí za to :-)
OdpovědětVymazatTo jste to docela zkomplikoval.
OdpovědětVymazatNejjednodušší vysvětlení je, že zatímco v programovacích jazycích jsou operátory násobení a dělení asociativní zleva a mají stejnou prioritu, v typografické konvenci není operátor dělení asociativní vůbec (zápis 12/4/2 je nejednoznačný a proto je nepřípustný) a má nižší prioritu než operátor násobení, což navíc posiluje zvyk operátor násobení mezi jinými operandy než čísly vypouštět (1/ab většina lidí intuitivně chápe jako 1/(a*b), ačkoli pro počítače je to (1/a)*b).
Díky.
OdpovědětVymazatProč zkomplikoval? Podle mne konvence zní stejně jako v programovacích jazycích. Jediná odchylka je vypouštění operátoru násobení, což ale některé kalkulátory respektují, což znamená, že dají špatný výsledek.
Nejlépe je celý problém v diskussi popsán takto:
OdpovědětVymazat„1) pravidlo o vyhodnocování zleva doprava platí - při použití nekomutativních operací (zde násobení a dělení) totiž _záleží_ na pořadí operandů
2) výraz 6 ÷ 2(1 + 2) je napsán zcela jednoznačně, je to jen jiná forma 6/2*(1+2)
dohady o tom, jestli lomítko platí jen pro 2 nebo pro celý zbytek výrazu za ním, jsou zcela mimo mísu, neboť
operátor platí pouze pro nejbližší operand, pokud tomu má být jinak, použijí se závorky
tzn. jelikož za číslicí 2 následuje (vynechaný) symbol operátoru násobení, operand tam končí a začíná se vyhodnocovat další operace.“
Odkdy je násobení nekomutativní? Asi nějaký odborník…
OdpovědětVymazatPro mne je ten problém irelevantní, protože v programovacích jazycích jsou pravidla pro vyhodnocování výrazů dána a v běžné komunikaci je nutné podobných nejednoznačností se vystříhat. Takže no news.
OT: Vy jste vypnul nestování komentářů nějakou úpravou šablony, nebo je to výsledek chyby u Googlu?
OdpovědětVymazatOdkdy je násobení nekomutativní? Asi nějaký odborník…
OdpovědětVymazatTím myslel jen dělení, ale přepsal se.
Pro mne je ten problém irelevantní
Jistě. Je to jen taková hříčka, jak exaktně vyhodnocovat málo používanou formu zápisu. Faktem je, že export závorky vně je tak extrémně zažitý, že mnoha lidem nepřijde, že je špatně.
OT: Vy jste vypnul nestování komentářů nějakou úpravou šablony, nebo je to výsledek chyby u Googlu?
Ani jedno, ani druhé. Schválně jsem to nezapnul.
Je to jen taková hříčka, jak exaktně vyhodnocovat málo používanou formu zápisu.
OdpovědětVymazatAle vůbec ne! Na exaktní vyhodnocování výrazů jsou určeny parsery, celé melodrama je o tom, že jeden výrobce kalkulaček použil u nového modelu jiný parser než u starého. Vzrušovat to může pouze humanitní vědce :-)
No, o kalkulačky jde až v druhé řadě. Tady se jedná primárně o to, co znamená 2(1+2).
OdpovědětVymazat