Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Wangarad 18. 02. 2021, 12:30:00

Název: Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Wangarad 18. 02. 2021, 12:30:00
Tak dalsia otazka.
Ako je mozne ze Python "Nevie spravne zaokruhlovat" ma cele cislo?
Kód: [Vybrat]
data_1 = 83.5
data = 82.5
print(round(data_1))
print(round(data))
Vysledok
Kód: [Vybrat]
84
82
ako to osetrit aby to vzdy zaokruhlovalo hore?
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Petr Nohavica 18. 02. 2021, 12:38:32
Mozna to chce cist dokumentaci, z https://docs.python.org/3/library/functions.html#round:
Citace
For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5) and round(-0.5) are 0, and round(1.5) is 2).

Pokud chces standardnejsi chovani, zkus
Kód: [Vybrat]
num_rounded = int(num + 0.5)
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: playback 18. 02. 2021, 13:32:17
Možná by stálo za to napsat, o jaký python se jedná.

Kód: [Vybrat]
Python 2.7.15 (default, Oct 15 2018, 15:24:06)
[GCC 8.1.1 20180712 (Red Hat 8.1.1-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> data_1 = 83.5
>>> data = 82.5
>>> print(round(data_1))
84.0
>>> print(round(data))
83.0
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: RDa 18. 02. 2021, 14:01:12
Zaokrouhlovani sudym smerem je jedno ze standardnich chovani pro IEEE floaty:
https://en.wikipedia.org/wiki/Rounding#Round_half_to_even
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: radioing 18. 02. 2021, 22:47:42
https://realpython.com/python-rounding/#rounding-half-to-even
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Pajaha 19. 02. 2021, 16:38:29
Kterého dementa napadlo, že zaokrouhlených 1.5 se bude rovnat zaokrouhlených 2.5 ?
By mě zajímalo, kdo vymýšlí takovéhle vyfikundace a navíc je nacpe do standardní funkce.
K čemu to vůbec je?
 

Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 19. 02. 2021, 17:10:47
Kterého dementa napadlo, že zaokrouhlených 1.5 se bude rovnat zaokrouhlených 2.5 ?
By mě zajímalo, kdo vymýšlí takovéhle vyfikundace a navíc je nacpe do standardní funkce.
K čemu to vůbec je?
Napadlo to někoho, kdo toho o zaokrouhlování ví víc, než vy. Existuje totiž mnoho způsobů, jak zaokrouhlovat. Tenhle způsob zaokrouhlování vede k menší průměrné chybě, která se zaokrouhlováním vnáší. Ona je totiž pětka jaksi přesně uprostřed intervalu, takže když ji budete zaokrouhlovat stále k větší absolutní hodnotě (tzv. matematické zaokrouhlování, které asi znáte ze ZŠ) a budete mít nerovnoměrně rozložená kladná a záporná čísla (např. budete zaokrouhlovat jenom samé kladné hodnoty), bude vám zaokrouhlování systematicky posouvat výsledek (u kladných čísel nahoru).

Nazývat někoho dementem jenom kvůli vlastní neznalosti je – řekněme hloupé.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Mlocik97 19. 02. 2021, 18:04:07
Kterého dementa napadlo, že zaokrouhlených 1.5 se bude rovnat zaokrouhlených 2.5 ?
By mě zajímalo, kdo vymýšlí takovéhle vyfikundace a navíc je nacpe do standardní funkce.
K čemu to vůbec je?
Napadlo to někoho, kdo toho o zaokrouhlování ví víc, než vy. Existuje totiž mnoho způsobů, jak zaokrouhlovat. Tenhle způsob zaokrouhlování vede k menší průměrné chybě, která se zaokrouhlováním vnáší. Ona je totiž pětka jaksi přesně uprostřed intervalu, takže když ji budete zaokrouhlovat stále k větší absolutní hodnotě (tzv. matematické zaokrouhlování, které asi znáte ze ZŠ) a budete mít nerovnoměrně rozložená kladná a záporná čísla (např. budete zaokrouhlovat jenom samé kladné hodnoty), bude vám zaokrouhlování systematicky posouvat výsledek (u kladných čísel nahoru).

Nazývat někoho dementem jenom kvůli vlastní neznalosti je – řekněme hloupé.

To mi príde sprosté, a na výpočet priemernej hodnoty po zaokrúhlení čísel z pola desatinných čísel (napr. všetkých končiacich .5) existuje logickejší spôsob pomocou sčitovania zvyškov z modula a deleno a následne je zdeliť a pričítať ku priemeru samotných celých čísel (s odrezaním desatinej časti), alebo ešte lepší, a to vynásobiť hodnoty *10 následne vypočítať priemer a výsledný priemer vydeliť /10 a previesť na celé číslo. V oboch prípadoch neprekročíš odchýlku väčšiu než 0.5
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Logik 19. 02. 2021, 18:49:05
Mlocik:To ale zacházíš se znalostí původních nezaokrouhlenejch čísel. Todle řeší problém, když nejdřív zaokrouhlíš, a pak Tě napadne spočítat průměr. Tam už nijak nevyřešíš, že průměr čísel 0.5,1.5 Ti vyjde 1.5, protože dostaneš čísla 1,2 a z nich nijak nevyčteš, co byly původně.
Zatímco  u velkých sad čísel (pokud tedy nemají nějaké obskurní rozdělení), když to zaokrouhlíš tím IEEE způsobem, tak se Ti chyba "požere"  s poměrně velkou statistickou jistotou.

PS: A úplně nejlepší je takovej průměr znova zaokrouhlit. Vyjde Ti, že průměr čísel 0.5 a 1.5 je 2....
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 19. 02. 2021, 19:11:27
To mi príde sprosté, a na výpočet priemernej hodnoty po zaokrúhlení čísel z pola desatinných čísel (napr. všetkých končiacich .5) existuje logickejší spôsob pomocou sčitovania zvyškov z modula a deleno a následne je zdeliť a pričítať ku priemeru samotných celých čísel (s odrezaním desatinej časti), alebo ešte lepší, a to vynásobiť hodnoty *10 následne vypočítať priemer a výsledný priemer vydeliť /10 a previesť na celé číslo. V oboch prípadoch neprekročíš odchýlku väčšiu než 0.5
Ono samozřejmě nejde o výpočet průměrné hodnoty zaokrouhlených čísel. Představte si, že vám třeba banka vyplácí úroky ze zůstatku na účtu. Na účtu typicky nemáte nějakou kulatou částku, takže po vypočtení úroku vyjde nějaké hausnumero jako 0,12489 Kč. To vám banka samozřejmě vyplatit nemůže, je potřeba to zaokrouhlit na halíře. No a když to banka bude zaokrouhlovat matematicky, tedy 0,5 hal vždy nahoru, zaplatí nakonec na úrocích víc, než by odpovídalo úrokové sazbě. Když bude zaokrouhlovat na nejbližší sudé číslo, vyplatí celkově přibližně tolik, kolik by odpovídalo úrokové sazbě – zaokrouhlovací chyby se navzájem víceméně vyruší.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: _Jenda 19. 02. 2021, 19:13:17
To mi príde sprosté, a na výpočet priemernej hodnoty po zaokrúhlení čísel z pola desatinných čísel (napr. všetkých končiacich .5) existuje logickejší spôsob
To byl příklad. Existuje hromada dalších numerických algoritmů a určitě to nechceš řešit u každého individuálně, pokud to vůbec jde. Právě proto se zavedlo zaokrouhlování, které pokud možno nevnáší systematickou chybu.

alebo ešte lepší, a to vynásobiť hodnoty *10 následne vypočítať priemer a výsledný priemer vydeliť /10 a previesť na celé číslo
Jak se to bude chovat, pokud 10násobek (resp. 2násobek pokud to počítáš normálně binárně) po uložení do floatu ztratí přesnost? Ne, udělat numerické algoritmy dobře je věda, a bohužel to náhodný diskutující z Rootu bez ani základní znalosti problémů, které ho můžou potkat, neobejde…
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: greenlinuxguru 19. 02. 2021, 19:41:21
už se těším, až tu více lidí přijde na to, že 0.1 s 20 desetiními místy u float je 0.999xxx :)
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Kit 19. 02. 2021, 19:54:31
už se těším, až tu více lidí přijde na to, že 0.1 s 20 desetiními místy u float je 0.999xxx :)

Není...
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 19. 02. 2021, 19:56:22
už se těším, až tu více lidí přijde na to, že 0.1 s 20 desetiními místy u float je 0.999xxx :)
„Číslo s X desetinnými místy u float“ je nesmysl, pokud tedy myslíte float podle IEEE 754 (tedy ve skutečnosti single – 32 bitů). Každé číslo reprezentovatelné v IEEE 754 je reprezentované právě jedním způsobem. Pokud si určíte počet desetinných míst na výstupu, bude se muset buď zaokrouhlit nebo doplnit nulami (pokud zrovna nepotřebujete ten počet míst, který je v daném čísle použit). Takže když se pokusíte do single typu uložit 0,1, uloží se tam ve skutečnosti přesně 0,100000001490116119384765625. Pokud z toho při výpisu dostanete 0,999…, máte něco špatně…
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Mlocik97 19. 02. 2021, 20:32:43
To mi príde sprosté, a na výpočet priemernej hodnoty po zaokrúhlení čísel z pola desatinných čísel (napr. všetkých končiacich .5) existuje logickejší spôsob pomocou sčitovania zvyškov z modula a deleno a následne je zdeliť a pričítať ku priemeru samotných celých čísel (s odrezaním desatinej časti), alebo ešte lepší, a to vynásobiť hodnoty *10 následne vypočítať priemer a výsledný priemer vydeliť /10 a previesť na celé číslo. V oboch prípadoch neprekročíš odchýlku väčšiu než 0.5
Ono samozřejmě nejde o výpočet průměrné hodnoty zaokrouhlených čísel. Představte si, že vám třeba banka vyplácí úroky ze zůstatku na účtu. Na účtu typicky nemáte nějakou kulatou částku, takže po vypočtení úroku vyjde nějaké hausnumero jako 0,12489 Kč. To vám banka samozřejmě vyplatit nemůže, je potřeba to zaokrouhlit na halíře. No a když to banka bude zaokrouhlovat matematicky, tedy 0,5 hal vždy nahoru, zaplatí nakonec na úrocích víc, než by odpovídalo úrokové sazbě. Když bude zaokrouhlovat na nejbližší sudé číslo, vyplatí celkově přibližně tolik, kolik by odpovídalo úrokové sazbě – zaokrouhlovací chyby se navzájem víceméně vyruší.

V takej situácii nie je normálne v systéme ukladať hodnotu s vysokou presnosťou (trebárs aj 10 desatinných miest), ale pri vyplatený "odrezať tých 0.00neco a čakať až sa pri ďalšom zapísaní úroky preklopý tá hodnota cez 0.01 ? takto nikdy nestratí ani cent ani nedá ani cent navyše. Že v systéme bude hodnota desatinná nemusí znamenať že musí banka vyplatiť desatinné haliere.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 19. 02. 2021, 20:51:03
V takej situácii nie je normálne v systéme ukladať hodnotu s vysokou presnosťou (trebárs aj 10 desatinných miest), ale pri vyplatený "odrezať tých 0.00neco a čakať až sa pri ďalšom zapísaní úroky preklopý tá hodnota cez 0.01 ? takto nikdy nestratí ani cent ani nedá ani cent navyše. Že v systéme bude hodnota desatinná nemusí znamenať že musí banka vyplatiť desatinné haliere.
Nedovedu si moc představit, jak byste tohle popisoval v obchodních podmínkách. Pořád ale hledáte detaily na konkrétním příkladu, ale neřešíte princip.

Můžeme zkusit jiný příklad. Obyčejná prodejna s potravinami, která má ceny, které mají náhodné rozdělení (tedy žádné psychologické ceny záměrně končící devítkami). Ceny jsou normálně s přesností na halíře. Když se platí v hotovosti, je potřeba cenu nákupu zaokrouhlit na celé koruny. Když se bude zaokrouhlovat matematicky („pětka nahoru“), obchod na zaokrouhlování hotovostních nákupů vydělá. Když se bude pětka zaokrouhlovat na nejbližší sudé číslo, obchod na tom v průměru nevydělá ani neprodělá.

Doufám, že se nedozvím, že dneska každý platí kartou…
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Kit 20. 02. 2021, 00:02:06
V takej situácii nie je normálne v systéme ukladať hodnotu s vysokou presnosťou (trebárs aj 10 desatinných miest), ale pri vyplatený "odrezať tých 0.00neco a čakať až sa pri ďalšom zapísaní úroky preklopý tá hodnota cez 0.01 ? takto nikdy nestratí ani cent ani nedá ani cent navyše. Že v systéme bude hodnota desatinná nemusí znamenať že musí banka vyplatiť desatinné haliere.

Banky nepoužívají float, ale decimal.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Pajaha 20. 02. 2021, 21:30:21
Kterého dementa napadlo, že zaokrouhlených 1.5 se bude rovnat zaokrouhlených 2.5 ?
By mě zajímalo, kdo vymýšlí takovéhle vyfikundace a navíc je nacpe do standardní funkce.
K čemu to vůbec je?
Napadlo to někoho, kdo toho o zaokrouhlování ví víc, než vy. Existuje totiž mnoho způsobů, jak zaokrouhlovat. Tenhle způsob zaokrouhlování vede k menší průměrné chybě, která se zaokrouhlováním vnáší. Ona je totiž pětka jaksi přesně uprostřed intervalu, takže když ji budete zaokrouhlovat stále k větší absolutní hodnotě (tzv. matematické zaokrouhlování, které asi znáte ze ZŠ) a budete mít nerovnoměrně rozložená kladná a záporná čísla (např. budete zaokrouhlovat jenom samé kladné hodnoty), bude vám zaokrouhlování systematicky posouvat výsledek (u kladných čísel nahoru).

Nazývat někoho dementem jenom kvůli vlastní neznalosti je – řekněme hloupé.

Zatímco tohle zaokrouhlování zvýhodní sudá čísla. Prostě posun k dokonalosti.

Krom toho Váš příklad s obchodem pokulhává, při Vaší genialitě byste měl vědět jak se tam správně na ty koruny zaokrouhluje a neplácat tady nesmysly.  Stejně tak se platí i DPH.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 20. 02. 2021, 22:11:52
Zatímco tohle zaokrouhlování zvýhodní sudá čísla. Prostě posun k dokonalosti.
Což ve většině případů ničemu nevadí, na rozdíl od systematického posunu jedním směrem. Nicméně právě proto existuje více způsobů zaokrouhlování a podle situace se vybere ten, který napáchá nejméně škod.

Krom toho Váš příklad s obchodem pokulhává, při Vaší genialitě byste měl vědět jak se tam správně na ty koruny zaokrouhluje a neplácat tady nesmysly.  Stejně tak se platí i DPH.
V obchodě se (v ČR) pouze při platbě v hotovosti ze zákona zaokrouhluje na nejbližší nominální hodnotu peněz (§ 3 odst. 1 písm. c) zákona č. 634/1992 Sb.). Což opět neřeší případ, kdy se má zaplatit 50 haléřů. Takže tam už záleží na obchodníkovi, zda bude zaokrouhlovat spravedlivě na nejbližší sudé číslo, nebo zda bude zaokrouhlovat ve svůj prospěch na vyšší číslo, nebo ve prospěch zákazníka na nižší číslo.

Že vím, jak se v obchodě v ČR správně zaokrouhluje, nesvědčí o mé genialitě. Nicméně to, že vy to nevíte a na základě chybné domněnky kritizujete někoho jiného, svědčí o vaší hlouposti.

Jinak můj příklad s obchodem byl opět jen příklad na zaokrouhlování. Pokud zaokrouhlování stanoví zákon tak, že povede k systematické chybě, obchodník s tím nic dělat nemůže. To ale není případ ČR, kde zákon právě ten detail, o kterém se celou dobu bavíme, neřeší.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: registrovany123 21. 02. 2021, 03:30:16
Me fascinuje, jak ani to zatracene zaokrhouhlovani nejde delat jednim zpusobem, a je to slozite.

A zase tady naklusal p Jirsak a... nastala klasicka situace.

Hele. U me automaticky kdyz se rekne zaokrouhlouvat, tak to znamena nahoru. Pokud nechci at se mi posunuje vysledek jednim smerem pri vypoctech, tak sakra himl hergot fix NEZAOKROUHLUJU!!! Pocitam s floaty tak jak vysly! Zaokrouhlovat se ma az finalni zobrazeni stavu. Neco jako to ma Excel napr.

Tohle je u me standard pocitani s desetinnym cisly.

Chapu pointu te zaokrouhlovaic funcke, ale tu si ma Python puzivat jen interne pro svoje interni potreby. Pro uzivatele je takova funkce jenom matouci.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: _Jenda 21. 02. 2021, 03:46:53
Pokud nechci at se mi posunuje vysledek jednim smerem pri vypoctech, tak sakra himl hergot fix NEZAOKROUHLUJU!!! Pocitam s floaty tak jak vysly!
A to snad není zaokrouhlování? Float má pevně dlouhou mantissu, a výsledky běžně počítaných funkcí (i třeba pouhé sčítání čísel když to zrovna náhodou nevyjde „hezky“) se musí zaokrouhlit, aby šly reprezentovat.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: registrovany123 21. 02. 2021, 04:13:21
Pokud nechci at se mi posunuje vysledek jednim smerem pri vypoctech, tak sakra himl hergot fix NEZAOKROUHLUJU!!! Pocitam s floaty tak jak vysly!
A to snad není zaokrouhlování? Float má pevně dlouhou mantissu, a výsledky běžně počítaných funkcí (i třeba pouhé sčítání čísel když to zrovna náhodou nevyjde „hezky“) se musí zaokrouhlit, aby šly reprezentovat.

Vsak jo, ale at se zaokrouhli, az kdyz se jdou reprezentovat, a ne v procesu vypoctu.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 21. 02. 2021, 10:11:33
Tohle je u me standard pocitani s desetinnym cisly.
Jistě, naučil jste se to v šesté třídě a už jste se pak nikdy nedozvěděl, že to ve skutečnosti může být trochu komplikovanější (jako všechny věci, které se člověk naučil v šesté třídě). Tak pokud půjdete třeba k lékaři, doufejte, že nemá stejný přístup jako vy, že všechno důležité se naučil už v šesté třídě a žádné hlubší znalosti nepotřebuje.

Vsak jo, ale at se zaokrouhli, az kdyz se jdou reprezentovat, a ne v procesu vypoctu.
Co jiného asi dělá

Kód: [Vybrat]
print(round(data))
na konci výpočtu, než že to zaokrouhlí výsledek při prezentaci a ne v procesu výpočtu?
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: registrovany123 21. 02. 2021, 10:29:12
Tohle je u me standard pocitani s desetinnym cisly.
Jistě, naučil jste se to v šesté třídě a už jste se pak nikdy nedozvěděl, že to ve skutečnosti může být trochu komplikovanější (jako všechny věci, které se člověk naučil v šesté třídě). Tak pokud půjdete třeba k lékaři, doufejte, že nemá stejný přístup jako vy, že všechno důležité se naučil už v šesté třídě a žádné hlubší znalosti nepotřebuje.

Vsak jo, ale at se zaokrouhli, az kdyz se jdou reprezentovat, a ne v procesu vypoctu.
Co jiného asi dělá

Kód: [Vybrat]
print(round(data))
na konci výpočtu, než že to zaokrouhlí výsledek při prezentaci a ne v procesu výpočtu?

To je tak, ale tak typicka diskuze s vama...

A mozna i v 6 tride jsem si vsiml, ze Excel vzdycky zaokrouhluje zobrazovane hodnoty (5 zaokrhluje nahoru), ale pocita se skutecnyma hodnotama. Touto metodikou k zadnemu posunu vysledku jednim smerem nedochazi.

Nikdy jsem zadny jiny typ zaokrohlovani nepotreboval, a nepotrebuju ho ani ted! Ta funkce round() je shit!
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 21. 02. 2021, 10:56:35
To je tak, ale tak typicka diskuze s vama...
Ano, je. Někdo něco neví, nadává kvůli tomu ostatním. Já to vysvětlím, jak to je doopravdy – načež dotyčný přijde s nějakým novým výmyslem. A pak se přiřítí další neználek na podporu tomu prvnímu a trvá na tom, že jeho znalosti z 6. třídy jsou vrchol vědění a nic podrobnějšího nemůže existovat.

A mozna i v 6 tride jsem si vsiml, ze Excel vzdycky zaokrouhluje zobrazovane hodnoty (5 zaokrhluje nahoru), ale pocita se skutecnyma hodnotama. Touto metodikou k zadnemu posunu vysledku jednim smerem nedochazi.
Excel si také myslí, že rok 1900 byl přestupný. Nebral bych Excel úplně jako etalon matematiky. Mimochodem, Excel umí minimálně 6 způsobů zaokrouhlování – ten, který znáte vy, pak zaokrouhlování od nuly, k nule, zaokrouhlování na liché a zaokrouhlování na sudé (což je přesně to samé, co dělá round() v Pythonu). Šestý způsob je zaokrouhlování na násobky libovolného čísla (třeba 12 nebo 0,25).

K posunu výsledků jedním směrem v tomhle případě samozřejmě dochází. On totiž výsledek nemusí být jenom jeden, jak si představujete. Představte si, že máte v Excelu třeba ceník výrobků, které prodáváte. Pak zjistíte, že je inflace a že se vám zvyšují náklady. Nebudete chtít zjišťovat, co přesně se o kolik zdražilo (ono když se vám zvedne nájemné, plat účetní a cena elektřiny, musíte to stejně nějak rozpočítat mezi všechny výrobky), tak se rozhodnete zdražit vše o inflaci. Takže potřebujete inflací přenásobit každou jednotlivou položku. Když budete zaokrouhlovat tak, jak jste se naučil v 6. třídě, zdražíte celkově víc, než je inflace.

Nikdy jsem zadny jiny typ zaokrohlovani nepotreboval, a nepotrebuju ho ani ted! Ta funkce round() je shit!
Že jste to nikdy nepotřeboval vám nikdo nebere. To ale neznamená, že je nepotřebuje nikdo jiný. To, že funkce round() nezaokrouhluje tak, jak jste se vy naučil v 6. třídě, opravdu není chyba té funkce.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: panpanika 21. 02. 2021, 11:04:10
Ta funkce round() je shit!
ta funkce se chova presne tak, jak je popsana v dokumentaci. ze ji nectes nema s Jirsakem nic spolecnyho. Ale chapu ze to pro tebe musi byt zdrojem frustrace a potrebujes si do nekoho kopnout.
Kdyby ses chtel posunout o level nad tu sestou tridu, ktery tohle chovani odpovida, tak mezi dospelejma kdyz neco nevim a nekdo dalsi mi to vysvetli tak mu podekuju, spis nez abych na nej byl nasranej, ze jsem se mylil..
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: registrovany123 21. 02. 2021, 12:49:37

K posunu výsledků jedním směrem v tomhle případě samozřejmě dochází. On totiž výsledek nemusí být jenom jeden, jak si představujete. Představte si, že máte v Excelu třeba ceník výrobků, které prodáváte. Pak zjistíte, že je inflace a že se vám zvyšují náklady. Nebudete chtít zjišťovat, co přesně se o kolik zdražilo (ono když se vám zvedne nájemné, plat účetní a cena elektřiny, musíte to stejně nějak rozpočítat mezi všechny výrobky), tak se rozhodnete zdražit vše o inflaci. Takže potřebujete inflací přenásobit každou jednotlivou položku. Když budete zaokrouhlovat tak, jak jste se naučil v 6. třídě, zdražíte celkově víc, než je inflace.

Tohle je jadro pudla naseho sporu. Nesouhlasim a schvalne to vic rozvedme.

Mam ceni vyrobku v excelu. Tento cenik budu jistojiste mit s presnosti na 1 desetinne misto (desitky haleru). Kdyz budu chtit zvysit ceny o inflaci, tak je zvednu o inflaci, nacez 2. desetinne misto zaokrouhlim klasickou metodou:

10.50,- CZK -> + 3% inflace -> 10.815,- CKZ -> 10.8 CZK

Ukazte mi, v cem je podle vas problem se zaokrohlovanim.

Vy jste totiz strasne komplikovany clovek. Chapete to, ze 99.9% lidi, a dokonce i programatoru, staci bohate klasicky typ zaokrouhlovani, tzn. ten co jsme se vsichni na cele planete naucili v 6. tride?

Ja to chapu, ze existuje vice typu zaokrouhlouvoani, ale sakra, pro 99.9% programatoru je zaokrhlovani to z 6. tridy a zadne dalsi nepotrebujou.

A co me stve je, ze velevazeny Python, ktery si hraje na jazyk radoby jednoduchy a pro zacatecniky, obsahuje ve std lib takovou netradicni a zavadejici metodu zaokrouhlovani. Neni to prvni ani posledni bizarnost se kterou jsem se u Pythonu sektal.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: registrovany123 21. 02. 2021, 12:55:17
Mozna to chce cist dokumentaci, z https://docs.python.org/3/library/functions.html#round:
Citace
For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5) and round(-0.5) are 0, and round(1.5) is 2).

Pokud chces standardnejsi chovani, zkus
Kód: [Vybrat]
num_rounded = int(num + 0.5)

Sorry ale tohle prece neni reseni, co kdyz budes chtit zaokrouhlovat na 2 desetinna mista a nikoliv na cela cisla? Reseni co jsi uvedl bude sice delat to co ma, ale codewise je to spatne, spravne ma byt pouzita zaokrouhlovaci funkce.

Jsem nastvany, protoze takovyhle radoby chytrych reseni je co se Pythonu tyce plny STackoverflow, jsou to ustavicna polovicata reseni, ktera zpusobuji akorat neporadek. Ja v Pythonu delam v praci posledni rok a pul, a proste me tenhle pristup dost stve. Za Javy a z C# takovehle bizarnosti vubec neznam.

Java:

Kód: [Vybrat]
double roundOff = Math.round(a * 100.0) / 100.0;

Citace
    /**
     * Returns the closest {@code int} to the argument, with ties
     * rounding to positive infinity.
     *
     * <p>
     * Special cases:
     * <ul><li>If the argument is NaN, the result is 0.
     * <li>If the argument is negative infinity or any value less than or
     * equal to the value of {@code Integer.MIN_VALUE}, the result is
     * equal to the value of {@code Integer.MIN_VALUE}.
     * <li>If the argument is positive infinity or any value greater than or
     * equal to the value of {@code Integer.MAX_VALUE}, the result is
     * equal to the value of {@code Integer.MAX_VALUE}.</ul>
     *
     * @param   a   a floating-point value to be rounded to an integer.
     * @return  the value of the argument rounded to the nearest
     *          {@code int} value.
     * @see     java.lang.Integer#MAX_VALUE
     * @see     java.lang.Integer#MIN_VALUE
     */
    public static int round(float a) {

Asi vyvojari Javy proste pouzili znalosti z 6. tridy a meli by se stydt, nebo ja nevim...
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: registrovany123 21. 02. 2021, 13:11:44
Stejnetak C# rounding:

https://docs.microsoft.com/cs-cz/dotnet/api/system.math.round?view=net-5.0#Round1_Example

Nacez C# dokonce i obsahuje variantu, kde si muzu vybrat na kolik desetinnych cislic chci zaokrouhlovat:

Kód: [Vybrat]
public static double Round (double value, int digits);

Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: registrovany123 21. 02. 2021, 13:18:35
Že jste to nikdy nepotřeboval vám nikdo nebere. To ale neznamená, že je nepotřebuje nikdo jiný. To, že funkce round() nezaokrouhluje tak, jak jste se vy naučil v 6. třídě, opravdu není chyba té funkce.

Ne, to opravdu neni chyba te funkce. Ale je to chyba Pythonu a komunity, ze takova zavadejici funkce je pritomna pro zaokrouhlovani.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: registrovany123 21. 02. 2021, 13:31:20
Aha, sakra, vzdyt on ten C# taky zaokrouhluje na nejblizsi sude cislo...

Citace
Round(Double)   
Zaokrouhlí hodnotu s plovoucí desetinnou čárkou s dvojitou přesností na nejbližší celočíselnou hodnotu a zaokrouhlí střední hodnoty na nejbližší sudé číslo.

Ach jo. Raketaci zase mizi ze sceny. Jdu pryc z tohoto topicu. Ale ja se zase vratim.

Ale stejne si neodpustim rypnout. C# zase ukazal, ze knihovnu ma udelanou nejlip ze vsech a nejjasneji ze vsech. Kdyby to tak mela i Java nebo Python, neni zde dneska zadneho takovehoto sporu.

https://docs.microsoft.com/cs-cz/dotnet/api/system.math.round?view=net-5.0#System_Math_Round_System_Double_
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Mlocik97 21. 02. 2021, 13:57:25
Pokud nechci at se mi posunuje vysledek jednim smerem pri vypoctech, tak sakra himl hergot fix NEZAOKROUHLUJU!!! Pocitam s floaty tak jak vysly!
A to snad není zaokrouhlování? Float má pevně dlouhou mantissu, a výsledky běžně počítaných funkcí (i třeba pouhé sčítání čísel když to zrovna náhodou nevyjde „hezky“) se musí zaokrouhlit, aby šly reprezentovat.

To je ako argument že by sme teraz mali používať namiesto pí číslo 3, lebo aj tak presnú hodnotu čísla pí nevieme ani prezentovať ani nevieme použiť pri výpočte 100% presnú hodnotu pí (čož by vyžadovalo nekonečno času, keďže je to iracionálne číslo s nekonečným počtom cifier) Takže ok, od dnes používam namiesto pí, jednoducho číslo 3. Nemali by sme sa snažiť o najväčšiu presnosť, a až keď už vyššia není možná (kvôli prostriedkom) tak až potom zavádzať nepresnosť, ale na čo pridávať nepresnosť keď to není potrebné?

Takže v tomto plne súhlasím s Jenda.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: _Jenda 21. 02. 2021, 14:25:12
Pokud nechci at se mi posunuje vysledek jednim smerem pri vypoctech, tak sakra himl hergot fix NEZAOKROUHLUJU!!! Pocitam s floaty tak jak vysly!
A to snad není zaokrouhlování? Float má pevně dlouhou mantissu, a výsledky běžně počítaných funkcí (i třeba pouhé sčítání čísel když to zrovna náhodou nevyjde „hezky“) se musí zaokrouhlit, aby šly reprezentovat.

Vsak jo, ale at se zaokrouhli, az kdyz se jdou reprezentovat, a ne v procesu vypoctu.
Zakrouhlování i v procesu výpočtu je nevyhnutelné (pokud nepoužíváte speciální "exact" matematiku, která je ale nesmyslně náročná a předpokládám že v ní některé věci ani vyjádřit nepůjdou). Nebo jestli vás chápu: chtěl byste jedno zaokrouhlování při interním počítání na počítači (které bude round to even nebo obdobné, co nevnáší systematickou chybu) a druhé zaokrouhlování pro zobrazování člověku?

Citace
A mozna i v 6 tride jsem si vsiml, ze Excel vzdycky zaokrouhluje zobrazovane hodnoty (5 zaokrhluje nahoru), ale pocita se skutecnyma hodnotama.
To není pravda, dokonce jsem kvůli vám nastartoval virtuál s widlema a Office 2007.
Kód: [Vybrat]
B2 = 1E+21
C2 = 1
D2 = B2+C2
E2 = D2-B2 # zobrazí 0, mělo by zobrazit 1. Pokud nastavíme B2=1E+11, tak to správně zobrazí 1

Mam ceni vyrobku v excelu. Tento cenik budu jistojiste mit s presnosti na 1 desetinne misto (desitky haleru). Kdyz budu chtit zvysit ceny o inflaci, tak je zvednu o inflaci, nacez 2. desetinne misto zaokrouhlim klasickou metodou:

10.50,- CZK -> + 3% inflace -> 10.815,- CKZ -> 10.8 CZK

Ukazte mi, v cem je podle vas problem se zaokrohlovanim.
Vždyť už to tady psalo několik lidí: systematická chyba, zdražíte dohromady o víc než inflace. (jenom upozorňuji, že u příkladu s cenami to asi není nějak zásadní, ale tipuji že nějaké dlouho trvající numerické výpočty už s tím problém mají).
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Jose D 21. 02. 2021, 14:26:58
když už se nám tady rozjel offtopic.

To je ako argument že by sme teraz mali používať namiesto pí číslo 3, lebo aj tak presnú hodnotu čísla pí nevieme ani prezentovať ani nevieme použiť pri výpočte 100% presnú hodnotu pí (

a není to tak, že IRL přesně tohle děláme? Rozhodneš se o požadovaný přesnosti, a místo π použiješ nějakou dostatečně přesnou aproximaci?
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Mlocik97 21. 02. 2021, 14:43:19
když už se nám tady rozjel offtopic.

To je ako argument že by sme teraz mali používať namiesto pí číslo 3, lebo aj tak presnú hodnotu čísla pí nevieme ani prezentovať ani nevieme použiť pri výpočte 100% presnú hodnotu pí (

a není to tak, že IRL přesně tohle děláme? Rozhodneš se o požadovaný přesnosti, a místo π použiješ nějakou dostatečně přesnou aproximaci?

Áno keď presnosť nepotrebuješ, ale Filip sem dával príklad z banky, tam si myslím že presnosť naopak je potrebná, a navyše ak není tak to je ešte dôvod k tomu prečo tá funkcia v Pythone je nezmyselná (resp. určite sa má výhodu v určitých použitiach, ale štandardný round() mali nechať klasické základoškolské zaokruhlovanie. A ono príklad IRL ako človek vs počítač je tiež miešanie jabĺk s hruškami. Pretože ľudský mozog funguje inak ako počítač. Zatiaľ čo počítač má pamäť takú že raz mu dáš informáciu a on si ju pamätá, tak mozog nikoliv a mozog proste zabúda, najmä komplexnejšie informácie, preto sa zjednodušujú aby si to mozog zapamätal jednoduchšie. Ale keď do kalkulačky zadáš pí * 3 tak ti to nedá výsledok 9.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 21. 02. 2021, 20:54:21
Tohle je jadro pudla naseho sporu. Nesouhlasim a schvalne to vic rozvedme.

Mam ceni vyrobku v excelu. Tento cenik budu jistojiste mit s presnosti na 1 desetinne misto (desitky haleru). Kdyz budu chtit zvysit ceny o inflaci, tak je zvednu o inflaci, nacez 2. desetinne misto zaokrouhlim klasickou metodou:

10.50,- CZK -> + 3% inflace -> 10.815,- CKZ -> 10.8 CZK

Ukazte mi, v cem je podle vas problem se zaokrohlovanim.
Máme původní cenu 10 Kč, inflaci 3,5 %. Po vynásobení vyjde nová cena 10,35 Kč. Ceny chceme uvádět v desítkách haléřů. 10,35 Kč je stejně daleko od 10,3 Kč i 10,4 Kč. Když budu zaokrouhlovat vaším způsobem, budou tyhle „nerozhodné“ případy (s 5 halíři na konci) vždy zaokrouhlené na vyšší cenu, ve prospěch obchodníka. Když si pak udělá na konci kontrolu – sečte všechny staré ceny a všechny nové ceny, zjistí, že zdražil o něco víc než jen o inflaci 3,5 %.

Vy jste totiz strasne komplikovany clovek. Chapete to, ze 99.9% lidi, a dokonce i programatoru, staci bohate klasicky typ zaokrouhlovani, tzn. ten co jsme se vsichni na cele planete naucili v 6. tride?
Šmudlalům je to jedno – tak proč jim rovnou do ruky nedat zaokrouhlování, které funguje lépe než to vaše. No a lidé, kteří dělají práci pořádně, budou sami pátrat po tom, jaké zaokrouhlování nejlépe použít

A co me stve je, ze velevazeny Python, ktery si hraje na jazyk radoby jednoduchy a pro zacatecniky, obsahuje ve std lib takovou netradicni a zavadejici metodu zaokrouhlovani. Neni to prvni ani posledni bizarnost se kterou jsem se u Pythonu sektal.
Na té metodě není nic netradičního ani zavádějícího. Zaokrouhlování na sudé se používá naprosto běžně, protože neposouvá výsledky systematicky jedním směrem a je deterministické. Nevím, jestli má nějakou výhodu oproti zaokrouhlování na liché, ale prostě se všeobecně používá zaokrouhlování na sudé. To, že je Python jednoduchý jazyk pro začátečníky, neznamená, že nemůže věci dělat pořádně. Že vy jste se v matematice zasekl v 6. třídě je váš problém, ale není to důvod, proč by se Python měl přizpůsobovat vašim neznalostem.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: AoK 22. 02. 2021, 00:06:32
docela mě překvapuje, kolik lidí neví, jak počítače počítají s float a jaký v tom vznikají chyby. My přemýšlíme v desítkové soustavě, počítače v dvojkové, obě nejsou navzájem jednoduše převoditelná pro všechna reálná čísla. A ano, "počítače" neumí počítat.

V dobách, kdy cpu neměly dostatek výkonu, přišel Intel s IEEE 754, kde za cenu nižší přesnosti se dala čísla rychle počítat. Postupně se tenhle algoritmus etabloval napříč celým IT. Drtivá většina jazyků počítá float čísla nepřesně a zaokrouhluje během výpočtu interně, protože to jinak neumí.

Pokud potřebuji počítat přesně (účetnictví, peníze, měření), mám snad v každém jazyku k dispozici datový typ Decimal nebo cokoliv s binary floating point, pořád se ale musím vejít do určité přesnosti, chci-li počítat s neomezenou přesnosti, také to mohu dělat, vše je ale za cenu výkonu, který klesá i řádově.

V bankách vše běží na decimal, ať už v javě nebo v databázi. Dokonce i Cobol, který banky ještě dnes používají v některých systémech nemá neomezenou přesnost a musí se programy správně psát.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: _Jenda 22. 02. 2021, 02:37:25
V dobách, kdy cpu neměly dostatek výkonu, přišel Intel s IEEE 754, kde za cenu nižší přesnosti se dala čísla rychle počítat.
Tohle mě zarazilo - myslel jsem, že IEEE 754 je „nejpřesnější co se do takhle velkého typu (32/64bit) vejde“ - zejména že operace jsou „exaktní“ právě včetně korektního zaokrouhlení (kvůli tomu se tam občas používají ty intermediate 80bit hodnoty). Existuje něco, co by bylo přesnější, a problémem je pomalé počítání? Jak to funguje?

docela mě překvapuje, kolik lidí neví, jak počítače počítají s float a jaký v tom vznikají chyby.
Mě ani tak nezarazilo, že tohle někdo neví (málokdo potřebuje analyzovat přesnost numerických výpočtů, my taky neznáme detaily spousty jiných podoborů), ale to, jakým způsobem tady svoji nevědomost několik lidí prezentuje.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: _Jenda 22. 02. 2021, 02:43:52
Pokud nechci at se mi posunuje vysledek jednim smerem pri vypoctech, tak sakra himl hergot fix NEZAOKROUHLUJU!!! Pocitam s floaty tak jak vysly!
A to snad není zaokrouhlování? Float má pevně dlouhou mantissu, a výsledky běžně počítaných funkcí (i třeba pouhé sčítání čísel když to zrovna náhodou nevyjde „hezky“) se musí zaokrouhlit, aby šly reprezentovat.

Vsak jo, ale at se zaokrouhli, az kdyz se jdou reprezentovat, a ne v procesu vypoctu.
Už mi asi došlo kde jsme se nepochopili: reprezentací jsem nemyslel konečné vytištění výsledku uživateli, ale to, že FPU dospěla k nějakému výsledku, a teď ho potřebuje vrátit jako 32bit/64bit float. A tam se musí někdy zaokrouhlovat z principu (příklad: sqrt(2)) a někdy protože má výsledek víc bitů mantissy než se vejde do floatu.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Wangarad 22. 02. 2021, 08:37:12
ako riesenie je jednoduche staci pouzit kniznicu math a je to ok ale velmi ma to prekvapilo. Ja som sa v skole ucil ze od X.0 po X.4 sa zaokruhluje hore a od X.5 po X.9 zasa hore.
Rada o tom ako pripocitat +0.5 je chybna. To nie je spravna cesta.
Jenda a ked sa neda pouzit float? Napriklad ja citam data s DB kde je hodnota bud XXXX.5000 alebo 0.XXX podla toho viem su to litre alebo ml musim spravit konverziu a nakoniec to zaokruhlit na cele cislo smerom hore a vysledny format je INT ktory sa zapisuje do zariadenia ktore proste nevie co je float.

Celkovo dakujem za diskusiu okolo zaujimave citanie a myslim ze to pomoze viac ludom.

Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 22. 02. 2021, 08:49:30
Tohle mě zarazilo - myslel jsem, že IEEE 754 je „nejpřesnější co se do takhle velkého typu (32/64bit) vejde“ - zejména že operace jsou „exaktní“ právě včetně korektního zaokrouhlení (kvůli tomu se tam občas používají ty intermediate 80bit hodnoty). Existuje něco, co by bylo přesnější, a problémem je pomalé počítání? Jak to funguje?
To se takhle obecně nedá říct, jestli je to přesnější nebo méně přesné. IEEE 754 bylo zvoleno tak, aby co nejvíc pokrývalo čísla, se kterými běžně počítáme. Pokud budu chtít počítat astronomické vzdálenosti v kilometrech nebo subatomární rozměry v metrech, nebudu počítat ve float ani double, protože v prostoru reprezentovatelných hodnot budu mít obrovské množství čísel, která pro mé použití budou k ničemu, a použitelný prostor hodnot se mi velmi smrskne.

AoK ale podle mne myslel repezentaci ve 32 nebo 64 bitech. Když čísla v počítači reprezentujeme stejně, jako na papíře – desítkově s počtem číslic omezeným jenom tím, kolik jsme toho ochotní zapsat, máme čísla v počítači přesná. Ale rychlost výpočtu tím velmi utrpí.

Mě ani tak nezarazilo, že tohle někdo neví (málokdo potřebuje analyzovat přesnost numerických výpočtů, my taky neznáme detaily spousty jiných podoborů), ale to, jakým způsobem tady svoji nevědomost několik lidí prezentuje.
Mne teda zaráží i to, kolik programátorů to nezná. Tohle je věc, která se všude říká a je všude napsaná, jakmile dojde na čísla s plovoucí řádovou čárkou. Navíc je to věc, na kterou se nedá snadno přijít, pokud o ní člověk neví – dozví se to až z nějakého průšvihu z produkčního nasazení. U toho zaokrouhlování je to trochu něco jiného – tam by si člověk může uvědomit, že pětka je přesně uprostřed a že tedy zaokrouhlování „pětka vždy nahoru“ je nespravedlivé. Pak může začít pátrat po tom, zda to neřešil už někdo před ním – a zjistí, že řešil a že principů zaokrouhlování je spousta.

Ale ta prezentace nevědomosti je skutečně zarážející. Že si někdo nepřečte dokumentaci před tím, než funkci použije, to se dá pochopit – když o různých způsobech zaokrouhlování neví, nečeká v tom žádnou záludnost. Ale že si ji nepřečte ani po té, když narazí na problém, a místo toho metodou pokusu a omylu zkouší, které případy fungují jinak, než čekal, to je zarážející. Že si pak stále nepřečte dokumentaci a místo toho nadává v diskusním fóru, to už je donebevolající. A že se pak přidají další a nadávají těm, kteří to správně vysvětlí, pro to už nemám slov.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: Filip Jirsák 22. 02. 2021, 08:55:56
Rada o tom ako pripocitat +0.5 je chybna. To nie je spravna cesta.
Proč by to nebyla správná cesta? Přičíst 0,5 a pak oříznout desetinnou část je (pro nezáporná čísla) přesně to samé, jako zaokrouhlovat 0,5 nahoru (o záporných číslech vy jste také nic nepsal).

Jenda a ked sa neda pouzit float? Napriklad ja citam data s DB kde je hodnota bud XXXX.5000 alebo 0.XXX podla toho viem su to litre alebo ml musim spravit konverziu a nakoniec to zaokruhlit na cele cislo smerom hore a vysledny format je INT ktory sa zapisuje do zariadenia ktore proste nevie co je float.
To je příšerná reprezentace dat… Zda můžete použít float závisí na tom, jaký tam může být rozsah hodnot. Může být tak malý, že se vše vejde správně do float. Osobně bych ale v tomhle případě použil Decimal (nebo ekvivalent). V databázi to stejně nejspíš bude také reprezentované jako Number (tj. celkový počet platných míst a počet míst za desetinnou čárkou), takže konvertovat to na float je zbytečné. Navíc s tím neprovádíte žádné složité výpočty, takže pomalost Decimalu ničemu nevadí. Naopak máte jistotu, že nemusíte řešit záludnosti floatu.
Název: Re:Python zaokruhlovanie na cele cislo nefunguje spravne
Přispěvatel: AoK 22. 02. 2021, 11:36:00
V dobách, kdy cpu neměly dostatek výkonu, přišel Intel s IEEE 754, kde za cenu nižší přesnosti se dala čísla rychle počítat.
Tohle mě zarazilo - myslel jsem, že IEEE 754 je „nejpřesnější co se do takhle velkého typu (32/64bit) vejde“ - zejména že operace jsou „exaktní“ právě včetně korektního zaokrouhlení (kvůli tomu se tam občas používají ty intermediate 80bit hodnoty). Existuje něco, co by bylo přesnější, a problémem je pomalé počítání? Jak to funguje?


Ne nejpřesnější, ale efektivně využití prostoru. Čím čísla mají méně číslic, tím je hustota vyšší a tím i přesnost. Je jedno kolik bitů si necháš na číslo, pořád platí, že máš radix 2 a veškerá čísla za desetinným rozvojem musíš vyjádřit v základu jako 2^x * m, tady vzniká ta nepřenost, počet bitů jí jen posouvá "dozadu". U krátkých čísel to je jedno, k zaukrouhlení proběhne třeba až na 20. místě za desetinnou čárkou, takže ve výsledku pořád 0.1 + 0.2 bude 0.3. Ale u těch dlouhých čísel skáčet hodně vedle, stejně jako u těch příliš malých.

Pokud to chceš přesně, je tady Decimal Floating Point aka EEE754-2008. Intel má třeba svoje rozšíření Intel DFP Math (dříve Intel BCD opcodes), IBM má decNumber (tady je pěkná knihovna https://github.com/libdfp/libdfp, kterou jsme dříve používali u našeho telco operátora), GCC má také zabudovanou podporu (https://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html).

Zpomalení výpočtů se pohybuje od 2x až i po 50x podle typu operací, přes SIMD/AVX se dá ztráta dohnat. Jako reference může posloužit starší článek http://iccd.et.tudelft.nl/2009/proceedings/465Anderson.pdf, který pořád mám v záložkách. Samozřejmě, nesmím zapomenout na úžasné články Pavla Tišnovského tady na rootu, https://www.root.cz/clanky/interni-reprezentace-numerickych-hodnot-od-skutecneho-pocitacoveho-praveku-po-ieee-754-2008/ a https://www.root.cz/clanky/interni-reprezentace-numerickych-hodnot-od-skutecneho-pocitacoveho-praveku-po-ieee-754-2008-dokonceni/

Pokud jde o samotné zaokrouhlování, existují 4 možnosti, round nearest, round towards positive, round towards negative, round towards zero, tak praví IEEE 754. Každý jazyk si pak vybral ten vhodnější způsob podle toho, co se v něm za programy dělají a jaký na to autoři měli názor. Některé jazyky dovedou dokonce ti dát vybrat, např. v CUDA si mohu zvolit co chci před samotným výpočtem.




To je příšerná reprezentace dat… Zda můžete použít float závisí na tom, jaký tam může být rozsah hodnot. Může být tak malý, že se vše vejde správně do float. Osobně bych ale v tomhle případě použil Decimal (nebo ekvivalent). V databázi to stejně nejspíš bude také reprezentované jako Number (tj. celkový počet platných míst a počet míst za desetinnou čárkou), takže konvertovat to na float je zbytečné. Navíc s tím neprovádíte žádné složité výpočty, takže pomalost Decimalu ničemu nevadí. Naopak máte jistotu, že nemusíte řešit záludnosti floatu.

Jak jsem psal výše, přesnost nezávisí na velikosti čísla, ale spíše na jeho schopnosti se bezezbytku vyjádřit jako 2^x * m. Decimal je správná volba pro ukládání čísel, kde musím zachovat přesnost, ale také zabítá v databázích více místa, např. takový DECIMAL(20,6) v mysql zabere 13 bajtů, v Oraclu trochu méně, ale princip je podobný. Souhlas, že decimal by před float měl mít přednost kdykoliv si nejsem jistý, že mi float nevadí.