6. května 2012

Jednoznačnost mathematického zápisu

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ě.

9 komentářů:

  1. To jste to docela zkomplikoval.

    Nejjednodušší 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).

    OdpovědětVymazat
  2. Díky.

    Proč 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.

    OdpovědětVymazat
  3. Nejlépe je celý problém v diskussi popsán takto:

    „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.“

    OdpovědětVymazat
  4. Odkdy je násobení nekomutativní? Asi nějaký odborník…

    Pro 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.

    OdpovědětVymazat
  5. OT: Vy jste vypnul nestování komentářů nějakou úpravou šablony, nebo je to výsledek chyby u Googlu?

    OdpovědětVymazat
  6. Odkdy je násobení nekomutativní? Asi nějaký odborník…
    Tí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.

    OdpovědětVymazat
  7. Je to jen taková hříčka, jak exaktně vyhodnocovat málo používanou formu zápisu.

    Ale 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 :-)

    OdpovědětVymazat
  8. No, o kalkulačky jde až v druhé řadě. Tady se jedná primárně o to, co znamená 2(1+2).

    OdpovědětVymazat

Kursiva: <i></i>
Tučné písmo: <b></b>
Uvozovky: „“
Odkaz: <a href = ""></a>