Znaky mimo abecedu, styl zápisu čísla

Dobrý den všem,

snažím se vytvořit Wherigo s převody jednotek a narazil jsem na několik problémů. Přestože jsem prošel snad všechna témata ve fóru, odpovědi se mi najít nepodařilo.

  1. Jak nechat zobrazit např. řecké písmeno [mí]? Zkoušel jsem μ, μ i μ, ale ani jedno se mi v aplikaci WhereYouGo nezobrazilo správně.
  2. Jak nechat zobrazit např. symbol ? Opět jsem zkoušel několik různých možnosti, ale WhereYouGo nefunguje, jak bych chtěl.
  3. Malá čísla nebo naopak velká čísla při převodu z malých dílčích jednotek na velké násobné jednotky (a obráceně) se mi zobrazují ve tvaru ...E..., např. "3.0E-4". Pro uživatele by byl určitě vhodnější zápis 0.0003 (i když chybí mezera a je použita desetinná tečka). Jak způsob zobrazení nechat ve stylu např. 0.0003?
  4. Čas od času se mi stane, že např. místo zadaného čísla "0.000000000063" smartphone nějak převezme číslo "6.299999999999999E-11" čímž logicky při porovnávání nahlásí chybu. Jak tomuto problému předejít?

Předem moc všem děkuji za pomoc a rady.

LD

Ad 1., 2.:

Nezobrazíš. S tím se musíš smířit. Pokud je nezbytné, aby se zobrazily nějaké symboly, pak jedině jako obrázek (tj. celý text, který jsi chtěl napsat v textu, musíš udělat jako obrázek a ten zobrazit).

Ad 3., 4.:

Předpokládám, že čísla zobrazuješ tak, že je převádíš na textový řetězec a ten zobrazuješ. U čísel v plovoucí řádové čárce se to prostě občas stane, počítač implicitně z důvodu úspory místa nebo zvýšení přehlednosti zobrazí výsledek v exponenciálním tvaru. Stejně tak občas dojde k chybě zaokrouhlení (viz bod 4.).

Co s tím?

  1. Používat vlastní rutiny pro převod čísla na textový řetězec a nespoléhat na implicitní způsoby. Ale i tento způsob má úskalí.
  2. Čísla v plovoucí řádové čárce (v zásadě všechna desetinná čísla) není vhodné porovnávat na přesnou shodu právě z důvodů zaokrouhlovacích chyb. Vždy se doporučuje porovnávat s nějakou přesností, něco jako: 
    Absolutní hodnota (První číslo - Druhé číslo) <= Přesnost

    V Lua kódu: 

    math.abs(cislo1 - cislo2) <= presnost

    Hodnotu pro přesnost si musíš stanovit podle toho, jak potřebuješ.

Holt zpracování desetinných čísel v počítačích není jednoduché a dost často je potřeba si pomoci nějak jinak.

Například ve tvém příkladu 4. Předpokládám, že uživatel zapíše na telefonu do vstupu "0.000000000063", to ty převedeš na číslo a porováváš. A proč to neporovnávat přímo jako textový řetězec (myslím na obou stranách, že i to, s čím porováváš, budeš mít ve formě řetězce)?

No, moc obecných rad ti k tomu nedám. Asi bude potřeba postupovat případ od případu a pro každý zvolit nejvhodnější řešení. Ale zrovna takovéhle úlohy pro Lua (potažmo wherigo) asi nebudou úplně nejvhodnější.

To jsem viděl i v jiných (drahých) programech. Evidenční číslo desetimístné, tak ho dali jako Decimal a ono se ukázalo na konci místo jedničky 0.999999999999 a nedalo se podle něj hledat. Rychle to spravili. Ale proč ho nedali jako textový řetězec? To mě napadlo hned. Asi měli nějaký důvod. Třídění? Pokud wherigo umí zaokrouhlovat, lze taky to číslo zkusit zaokrouhlit a pak porovnávat.

Zaokrouhlovani nic moc neresi. Zpusob ulozeni cisel se tim nemeni (pokud nezmenis take typ cisla float na int). Desetinna cisla v plovouci radove carce jsou ulozena presne jen v pripade, ze jde o mocninu dvou (v mantise). To jsou jedina desetinna cisla, ktera lze ulozit presne.

Co to před porovnáním vynásobit a místo 0.000000000063 porovnávat 63 nebo 630?

Na druhou stranu - zadávat při hraní wiga takovéhle hodnoty bude vyloženě vopruz. Zvlášť jestli se k nim bude potřeba napřed dopočítat. Přijde mi to uživatelsky velmi... nepohodlné...

Už jsem pár wig napsal. Z praxe lze říci, že požadavky na hráče nesmějí převyšovat řekněme první obecnou a i tak sem tam dojde k problémům. Bohužel někteří hráči si v současné době neumějí ani správně nastavit telefon ke hře a při prvním problémku bombardují ownera, že to podělal a ať to opraví. Tady je mi JKLD docela líto, stráví spoustu času psaním kódu a řešením problémů, pak to najde pět kačerů a bude to na finálkách.

Co to před porovnáním vynásobit a místo 0.000000000063 porovnávat 63 nebo 630?

Jestli to budeš porovnávat v reálných číslech, tak si vůbec nepomůžeš. Postup popsaný mh.mailem je standardní a není důvod vymýšlet něco jiného.

Bohužel v operačních systémech obecně není numeric 1/1 = 1. Jde to demonstrovat i v obyčejném Excelu. A od toho se vše odvíjí. Používat jedině metodu “přesnosti”.

Dobrý den,

děkuji všem za rady.

1. ... řecké písmeno μ nahradím [mí]

2. ... symbol ≠ nahradím textem (není, nerovná se, ...)

3. a 4. ... omezím čísla tak, aby tak velká (malá) čísla nevycházela.

WIGo bylo zamýšleno jako zpestření výuky pro 6. ročník, kde se probírají převody jednotek. A ono, když padne náhodný převod z Giga na např. mikro, tak těch nul je moc. Zkrátka nastavím program tak, aby tak velké převody nenastaly.

Díky moc všem.

LD