Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 22. 8. 2014 11:01:21

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,678

Chyba Modulo[Runtime]

Nevím jistě, jestli jde o chybu programu, nebo jen nápovědy. Ale česká nápověda je přesným opisem té anglické. Přes to asi o chybu nápovědy nepůjde. Začnu ale nápovědou - respektive makrem, které je tam uvedeno :

Sub ExampleMod
    Print 10 Mod 2.5 ' vrátí 0
    Print 10 / 2.5 ' vrátí 4
    Print 10 Mod 5 ' vrátí 0
    Print 10 / 5 ' vrátí 2
    Print 5 Mod 10 ' vrátí 5
    Print 5 / 10 ' vrátí 0.5
End Sub

     Totéž je v LibreOffice stejně jako v Apache OpenOffice - obě nejnovější verze. Je to zase asi typ chyby, která už má letitou tradici z doby kdy existovalo jen samotné OpenOffice.


     Výše uvedené makro má chybu hned v prvním příkladu. Ačkoliv je uvedeno Print 10 Mod 2.5 ' vrátí 0. Tak ve skutečnosti vrací jedničku. teoreticky jsou možné 2 typy chyby.
     Buď se v operátoru Mod[Runtime] využívá array - pak dle příkladu array(0,1,2,3,4,5,6,7,8,9,10) = 11 prvků. Pak je logické že zbytek dělení je roven 1. proti této možnosti hovoří výsledek 10 Mod 5 ' vrátí 0 který je správně.
     Zbývá jediná možnost : Operátor Mod (Modulo) umí pracovat jen s čísly oboru čísel N - tedy celá čísla. Prakticky to znamená, že desetinné číslo zaokrouhlí. Konkrétně pak počítá uvedený příklad 10 Mod 3(místo 2,5) ' a správně vrátí 1.


     Vlastní zaokrouhlení může mít původ v anglické notaci desetinného čísla - tedy místo čárky - tečka. To ovšem platí pro vzorce sešitu. V Basicu platí tečka. Přes to jsem přepnul vše do angličtiny a odzkoušel se stejným výsledkem.
     Paradoxně Modulo ve vzorci (trošku jiná notace MOD(x;y) funguje bez tohoto problému. Zápis v Basicu (x Mod y) ale zaokrouhluje. Modulo je pojem z matematiky a neměl by mít 'více verzí' a když už tak to musí nápověda vysvětlit (obsahovat).
     Právě vzhledem k tomu se přikláním k názoru, že jde o chybu programu a ne nápovědy. Původně zřejmě operátor uměl pracovat s necelými čísly a bylo to správně. Mate mne to, že stejná chyba je také v ApacheOffice. Takže je to tradice zřejmě ještě z dob StarOffice - předchůdce OpenOffice.


    Udělal jsem to jako makro pro případ, že potvrdíte tuto chybu i na jiných OS a bylo by potřeba to postnout na BugZilu. Chyba Mod[Runtime]

Editoval neutr (22. 8. 2014 11:02:01)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#2 29. 9. 2014 19:06:59

strepon
Člen
Registrace: 6. 1. 2011
Příspěvků: 150

Re: Chyba Modulo[Runtime]

Dobrý postřeh, díky za něj. Čísla jsou opravdu nejspíš napřed zaokrouhlena. Jestli existuje nějaká "oficiální" definice modula, nevím, implementace se různí.
Každopádně je něco špatně, buď chování operátoru, nebo nápověda. Zadal jsem na bugzillu, snad tam někdo znalý poradí.

Offline

#3 29. 9. 2014 21:27:47

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,678

Re: Chyba Modulo[Runtime]

Obecně je MODULO zbytek po dělení. Pokud je dělenec celočíselně dělitelný je MODULO = 0. Takže dělitelem (i dělencem) může být necelé číslo (zlomek ap). Modulo je na první pohled až primitivní záležitost, ale při programování je prakticky nepostradatelné.
     Protipólem modula je celé číslo (v Basicu je to INT jako integer). Je to pochopitelně počet, kolikrát se dělitel vejde do dělence. Když si představíme klasický podíl - například 2,16 - pak vše před desetinnou čárkou (2) je INTEGER a vše za desetinnou čárkou (0,16 x dělitel) je MODULO.
     Při programování se neceločíselné hodnoty (dělenci i dělitelé) používají vyjímečně, proto by nevadilo když by se zaokrouhlovalo, ale musí to být někde napsané spolu s tím jak se zaokrouhluje. U celočíselných hodnot dělence a dělitele je modulem samozřejmě zase celé číslo (obor čísel N). Proto je logické, že to postačuje právě pro řízení programů a podobně. Tyto funkce lze nasimulovat poměrně dobře. Má to jenom jediný problém - počet desetinných míst při iracionálním podílu (výsledku), nebo dlouhém racionálním. Když to dělám já, tak si to usnadňuji pomocí výpočtu v sešitě, ale lze vymyslet jednoduchou metodu - například odečíst, či přičíst 0,5 a otestovat pomocí operátorů <, > zda je větší, či menčí nežli "xy", a nebo něco podobného pomocí dvojnásobku, mocniny aj.
     Právě proto tento problém (zaokrouhlování) bylo asi MODULO a INT vytvořeno. Proto je docela paradoxní, že to nefunguje nějak předvídatelně a tedy standardně podle nápovědy. Přes to si nemyslím, že je to chyba nápovědy.

Editoval neutr (29. 9. 2014 22:09:32)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#4 30. 4. 2015 15:55:27

strepon
Člen
Registrace: 6. 1. 2011
Příspěvků: 150

Re: Chyba Modulo[Runtime]

Chyba bude v 5.0 a 4.4.4 opravena. Operátor se bude chovat tak, jak je popsáno v nápovědě.

Offline

#5 1. 9. 2015 10:03:02

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 91

Re: Chyba Modulo[Runtime]

LibreOffice 5.0.0.5, Ubuntu 14.0.4.3

Chyba "opravena" (chová se podle nápovědy):

Sub Main
	Print 10 Mod 2.5
End Sub

Zde se vrátí nula.



Ale pokud napíšu toto:

Function MM(A as double, B as double) as double
	MM = A Mod B
End Function

Zde se chová ještě "normálně" a pokud zavolám funkci s parametry 10 a 2.5 vrátí jedničku, to znamená, že 2.5 se někde uvnitř zaokrouhlí na trojku.
Pro porovnání CAS wxMaxima vrací nulu, stejně jako WolframAlpha

Takže oprava je udělána jen napůl, pro pevné hodnoty funguje, ale pro proměnné ne. Jenže pevné hodnoty do  programu zadávat je nesmysl, to se hodí tak na ukázku do nápovědy, ale ne pro programování.

Editoval LADER (1. 9. 2015 10:04:33)

Offline

Zápatí