Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: modulo 27. 07. 2015, 15:38:00

Název: Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: modulo 27. 07. 2015, 15:38:00
Nazdar, mám jeden dotaz, proč je v Pythonu vymyšlená taková blbost jako že je -11 // 2 rovno -6? To je to totální hovadina, když budu já sám dělit celočíselně, tak mi to vyjde -5 a nějaký zbytek. Proč Python nerespektuje matematiku? To se tam nějaký vývojář nudil? Nebo měl nějaký vývojář Pythonu nutkání se odlišit za každou cenu?

Nehejtuji, chci jen vědět, logický důvod, proč je to tak a ne normálně jako všude jinde.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Radek Miček 27. 07. 2015, 15:48:20
Záleží, jak zaokrouhlujete. Například můžete zaokrouhlovat k 0, pak by vyšlo -5, jak říkáte, nebo lze zaokrouhlovat k mínus nekonečnu, pak vyjde -6.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Jan Vostrý 27. 07. 2015, 15:49:59
Protože // je definován jako "floor division"?
Tj. že vydělí a výsledek projede funkcí floor.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Kolemjdoucí 27. 07. 2015, 16:06:33
Proč Python nerespektuje matematiku? To se tam nějaký vývojář nudil? Nebo měl nějaký vývojář Pythonu nutkání se odlišit za každou cenu?

Protože líní tvůrci Pythonu si chtěli zjednodušit život, jednodušší je tohle furt zaokrouhlovat dolů.
Aby fungovalo 11/2=5 a zároveň -11/2=-5, tak se musí operace pro kladný a záporný čitatel zpracovávat odlišně, je tam práce navíc.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Jann 27. 07. 2015, 16:17:20
Nazdar, mám jeden dotaz, proč je v Pythonu vymyšlená taková blbost jako že je -11 // 2 rovno -6? To je to totální hovadina, když budu já sám dělit celočíselně, tak mi to vyjde -5 a nějaký zbytek. Proč Python nerespektuje matematiku? To se tam nějaký vývojář nudil? Nebo měl nějaký vývojář Pythonu nutkání se odlišit za každou cenu?

Nehejtuji, chci jen vědět, logický důvod, proč je to tak a ne normálně jako všude jinde.

Python to má právě implementováno tak, jak je to normálně definované v matematice. Např. v C to je nestandardně, stejně jako je v C nestandardně udělaná mocnina s racionálním exponentem.

Základní problém u nematematiků tkví v nepochopení funkce nazvané "celá část". Že celá část z 5,6 je 5, to obvykle chápou, ale že celá část z –5,6 je –6, s tím má spousta lidí z nějakého nepochopitelného důvodu problém.
Celá část je nejbližší menší celé číslo, pokud argumentem není celé číslo. Jasné jak facka.
Celočíselný podíl je definován jako celá část reálného podílu. Opět jasné jak facka.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: modulo 27. 07. 2015, 16:24:12
Tak v tom případě mi celý život na základce a na střední lhali  :'(

Ok, máte pravdu, opravdu jsem byl přesvědčený, že celočíselné dělení je podle mého způsobu jen to správné, nechápu tedy, proč to blbě učí i ve škole. No nic, člověk pořád něco nového zjišťuje.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Snow 27. 07. 2015, 16:51:59
protože // zaokrouhluje?
Jestli nechceš zaokrouhlovat použij  / (-11 / 2)
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Kolemjdoucí 27. 07. 2015, 17:00:20
Základní problém u nematematiků tkví v nepochopení funkce nazvané "celá část". Že celá část z 5,6 je 5, to obvykle chápou, ale že celá část z –5,6 je –6, s tím má spousta lidí z nějakého nepochopitelného důvodu problém.

Základní problém tkví v nepochopení, že funkce celá část je definována jinak pro nezáporné hodnoty a jinak pro záporné.
Mimo to existují operace Floor a Ceil, které se obě chovají jinak než operace Celá část.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Jann 27. 07. 2015, 17:09:04
Základní problém u nematematiků tkví v nepochopení funkce nazvané "celá část". Že celá část z 5,6 je 5, to obvykle chápou, ale že celá část z –5,6 je –6, s tím má spousta lidí z nějakého nepochopitelného důvodu problém.

Základní problém tkví v nepochopení, že funkce celá část je definována jinak pro nezáporné hodnoty a jinak pro záporné.
Mimo to existují operace Floor a Ceil, které se obě chovají jinak než operace Celá část.

Ne. Funkce "celá část" je definována pro všechna reálná čísla stejně a jde o synonymum pro funkci nazvanou "dolní celá část reálného čísla".

Místo psaní nesmyslů do diskusí ti (opět) doporučuji nejdřív si danou věc nastudovat.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Kolemjdoucí 27. 07. 2015, 17:12:24
Ne. Funkce "celá část" je definována pro všechna reálná čísla stejně a jde o synonymum pro funkci nazvanou "dolní celá část reálného čísla".

To je fatální omyl. Výsledek operace -11/2 je -5 zbytek -1. Jestliže máte nějaký jiný názor tak ho mít můžete, ale já s Vámi čas ztrácet nebudu.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: JSH 27. 07. 2015, 17:45:33
Matematicky musí celočíselné dělení splňovat n=q*d + r (q = n/d, r = n 'mod' d). Pro kladná čísla je to jednoznačné, ale pro záporná jsou tří možnosti :
Ani jedna z možností není "správně". Každá se hodí někdy jindy. Pro zajímavost C třeba vůbec nedefinuje, která možnost se má použít.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: frk 27. 07. 2015, 17:53:04
ostrý honza má pravdu, v dokumentaci se dočteš, že operátor // je funkce operator.floordiv .

to dělaní bych dělal: int(round(a/b))
Název: [OT] Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: mxlbzn 27. 07. 2015, 18:04:48
Pan modulo tedy řeší celočíselné dělení, ale s modulo záporného čísla, např. -11 % 10 == 9, je už psychicky srovnán? :)
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: ivoszz 27. 07. 2015, 18:05:46
Ne. Funkce "celá část" je definována pro všechna reálná čísla stejně a jde o synonymum pro funkci nazvanou "dolní celá část reálného čísla".

To je fatální omyl. Výsledek operace -11/2 je -5 zbytek -1. Jestliže máte nějaký jiný názor tak ho mít můžete, ale já s Vámi čas ztrácet nebudu.

Možná nebudete ztrácet čas, ale to neznamená, že fatální omyl tady nepropagujete vy. Protože zbytek je definován jako číslo větší nebo rovno nule a menší než dělitel, je výsledkem -6 a zbytek 1. Pokud vás někdo učil něco jiného, běžte mu vynadat. :)
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Jann 27. 07. 2015, 18:16:19
ostrý honza má pravdu, v dokumentaci se dočteš, že operátor // je funkce operator.floordiv .

to dělaní bych dělal: int(round(a/b))

V tom případě si musím nasypat popel na hlavu, Python tak neznám. Floored division není totéž, co standardní v matematice definované celočíselné dělení, tj. eukleidovské dělení. Floored division, někdy také "knuthovské dělení", zachovává u zbytku znaménko dělitele. IEEE 754 zase specifikuje, že podíl a zbytek se zvolí tak, aby byl zbytek v absolutní hodnotě co nejmenší. Atd. Celý tenhle chaos vznikl historicky kvůli různé implementaci a representaci čísel v HW a každá z těch nestandardních definic trpí oproti té eukleidovské "ortogonální" nějakým problémem.

To vše ale nic nemění na faktu, že základní v matematice používanou definicí celočíselného dělení a jeho zbytku je definice podle Eukleida, tj. zbytek vždy nezáporný a menší než absolutní hodnota dělitele.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Kolemjdoucí 27. 07. 2015, 18:32:29

Pro úplnost to tady napíšu všechno.

11/2=5 a zbytek 11-(2*5)=1
11/-2=-5 zbytek 11-(-2*-5)=1
-11/2=-5 zbytek -11-(2*-5)=-1
-11/-2=5 zbytek -11-(-2*5)=-1

Jestli tam někdo vidí šestku, tak s ním nechci mít vůbec nic společného.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Jann 27. 07. 2015, 18:36:24

Pro úplnost to tady napíšu všechno.

11/2=5 a zbytek 11-(2*5)=1
11/-2=-5 zbytek 11-(-2*-5)=1
-11/2=-5 zbytek -11-(2*-5)=-1
-11/-2=5 zbytek -11-(-2*5)=-1

Jestli tam někdo vidí šestku, tak s ním nechci mít vůbec nic společného.

No, to spíš naopak. Očividně jsi velmi hloupý člověk. To není urážka, to je prostě fakt.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: frk 27. 07. 2015, 18:46:36
... tak s ním nechci mít vůbec nic společného.

Jé, pane kolemjdoucí, vy jste ale chytrej. Spočítejte nám prosím ještě 00 a 0! ..
Název: Re:[OT] Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: modulo 27. 07. 2015, 19:21:02
Pan modulo tedy řeší celočíselné dělení, ale s modulo záporného čísla, např. -11 % 10 == 9, je už psychicky srovnán? :)

A co je zase tohle? :O  ;D
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: modulo 27. 07. 2015, 19:25:25
Napadá mě ještě jedna věc, když je Python tak "pragmatický", proč vymýšlí hovadiny? A nenechá takové celočíselné dělení, na které jsou všichni zvyklí?
Název: Re:[OT] Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Kolemjdoucí 27. 07. 2015, 19:34:34
modulo záporného čísla, např. -11 % 10 == 9

-11/10=-1 zbytek -11-(10*-1)=-1

proč vymýšlí hovadiny

Již jsem to uvedl, protože je to práce navíc a tvůrci byli líní.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: mxlbzn 27. 07. 2015, 19:43:04
-11 % 10, respektive -11 (mod 10) je opravdu 9. Pro pochopení je ale potřeba trochu víc zabrousit do modulární aritmetiky a tu operaci brát ne jako zbytek po dělení záporného čísla, ale jako aditivní doplněk (opačné číslo) v daném modulu.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: modulo 27. 07. 2015, 19:50:57
Ok, tak jsem si myslel, že je Python pro programátory a ne pro puntičkářské matematiky, škoda, líbil se mi.
Název: Re:[OT] Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Radek Miček 27. 07. 2015, 19:52:16
Pan modulo tedy řeší celočíselné dělení, ale s modulo záporného čísla, např. -11 % 10 == 9, je už psychicky srovnán? :)

A co je zase tohle? :O  ;D

Viz třeba euklidovské dělení (https://en.wikipedia.org/wiki/Euclidean_division).

Jelikož -11 = (-2)*10 + 9.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: modulo 27. 07. 2015, 20:01:07
Nějaký tip na multiplatformní skriptovací jazyk,ve kterém si rychle napíšu nejrůznější utility/blbiny, aniž by obsahoval nějakou zradu?
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Jakub Galgonek 27. 07. 2015, 20:10:31
Nějaký tip na multiplatformní skriptovací jazyk,ve kterém si rychle napíšu nejrůznější utility/blbiny, aniž by obsahoval nějakou zradu?

To, že zbytek po celočíselném dělení dvěma bude vždy 0 nebo 1, tě opravdu vyděsilo natolik, že hned hledáš jiný jazyk?
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: modulo 27. 07. 2015, 20:24:07
Ani ne, jak často budu provádět modulo nad záporným číslem? Málokdy.
Co se týče toho dělení, tak místo // budu používat int(a / b) a je to  8)

A stejně je dělení v Céčku to jediné správné, howgh.

Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Pavel Tisnovsky 27. 07. 2015, 21:29:53
Ani ne, jak často budu provádět modulo nad záporným číslem? Málokdy.
Co se týče toho dělení, tak místo // budu používat int(a / b) a je to  8)

A stejně je dělení v Céčku to jediné správné, howgh.

To jo, to totiz v C89 nejde rozporovat: "If either operand is negative, whether the result of the / operator is the largest integer less than the algebraic quotient or the smallest integer greater than the algebraic quotient is implementation-defined, as is the sign of the result of the % operator."

(C99 to uz ma mnohem lepsi, zaokrouhluje k nule, coz je sice docela diskutabilni, ale oni to podle vseho okopirovali od Fortranu :-p)
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Kiwi 27. 07. 2015, 21:49:59
Ani ne, jak často budu provádět modulo nad záporným číslem? Málokdy.
Co se týče toho dělení, tak místo // budu používat int(a / b) a je to  8)

A stejně je dělení v Céčku to jediné správné, howgh.

Lidi a jazyky matematičtěji orientovaní dávají přednost buď euklidovskému dělení (např. Maple, Pascal) nebo znaménku zbytku podle dělitele (např. APL, J, Clojure, Lua, MathCad, Mathematica, MS Excel, Perl), některé jazyky dávají přednost symetrické variantě, tj. znaménko zbytku podle dělence (např. C podle ISO 1999, C#, JavaScript, PHP, Visual Basic), mnohé jazyky obsahují obě předešlé varianty (např. Ada, Fortran, Haskell, Java, Matlab, Prolog, Python, Ruby, Scheme, Smalltalk), některé jazyky to vůbec nedefinují (např. C před ISO 1999, Forth, BASIC), některé dávají na výběr mezi Euklidem a min |rem| (Scheme R6RS)...
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: mxlbzn 27. 07. 2015, 21:52:40
Nějaký tip na multiplatformní skriptovací jazyk,ve kterém si rychle napíšu nejrůznější utility/blbiny, aniž by obsahoval nějakou zradu?

Neříkám, že Haskell je na to úplně vhodný, ale pro dělení podle tvých představ má funkci quot. A taky má samostatné funkce pro zbytek po dělení (rem - remainder) a modulem (mod):
Kód: [Vybrat]
> quot (-11) 2
-5
> rem (-11) 10
-1
> mod (-11) 10
9
Navíc narozdíl od Pythonu (a % b) srávně odmítne spočítat mod a b (matematicky: a (mod b)) pro b < 0.
Název: Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: karel 28. 07. 2015, 04:24:23
Tak v tom případě mi celý život na základce a na střední lhali  :'(

Ok, máte pravdu, opravdu jsem byl přesvědčený, že celočíselné dělení je podle mého způsobu jen to správné, nechápu tedy, proč to blbě učí i ve škole. No nic, člověk pořád něco nového zjišťuje.

Ano lhali, ale to je ve školství naprosto normální, se vzrůstajícím vzděláním ti, ale lžou míň a míň.
Tak třeba na prvním stupni ti řekli, že nejde dělit neceločíselně, na druhém stupni už to šlo.
Na základce ti řekli, že odmocnina se záporného čísla neexistuje a kvadratická rovnice nemá řešení, no na střední ti ukázali komplexní čísla. Atd ....

není to tak o lži jako o tom co ti mohou říct aby si to ještě pochopil, nám celou střední učitel ve fizice říkal já bych vám ty vzorečky vysvětlil, ale neumíte matiku, nechápal sem až na vysoký sem pochopil, že nás celou dobu učili počty a né matiku.


Název: Re:[OT] Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Kolemjdoucí 28. 07. 2015, 08:10:52
Viz třeba euklidovské dělení (https://en.wikipedia.org/wiki/Euclidean_division).

Euklides záporná čísla ještě vůbec neznal, byly objeveny až dlouho po jeho smrti >:(
Název: Re:[OT] Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Radek Miček 28. 07. 2015, 08:35:42
Viz třeba euklidovské dělení (https://en.wikipedia.org/wiki/Euclidean_division).

Euklides záporná čísla ještě vůbec neznal, byly objeveny až dlouho po jeho smrti >:(

Čemu to vadí? Vždyť je to jen název.
Název: Re:[OT] Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Kolemjdoucí 28. 07. 2015, 08:53:50
Vadí to dost podstatně, protože přesně takhle vznikají nedorozumění jako tato diskuze.
Název: Re:[OT] Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: raiden 28. 07. 2015, 09:02:44
modulo záporného čísla, např. -11 % 10 == 9

-11/10=-1 zbytek -11-(10*-1)=-1

proč vymýšlí hovadiny

Již jsem to uvedl, protože je to práce navíc a tvůrci byli líní.

Je to presne naopak. Vetsina implementaci pythonu, vcetne te prvni, je v jazycich ktere definuji deleni stejne jako C. Takze nejjednodussi by bylo to definovat jako v C. Ze se rozhodli to udelat jinak byla prace navic...

Jinak ta python definice je obvykle presne to co od deleni chces :-). Priklad:

0 = nejaka nedele

-4 / 7 = -1
-4 % 7 = 3

takze streda o tyden driv. Pri pouziti C deleni ti vyjde nesmysl.

Podobne je to pro cas, simulaci n-D pole pomoci 1-D, atd.

Proste ta definice z C je fail a uz nejednou se me stalo ze jsem kolem jednoduchyho deleni musel mit nekolik podminek aby to fungovalo nejak rozumne...

Název: Re:[OT] Re:Celočíselné dělení se záporným číslem v Pythonu
Přispěvatel: Radek Miček 28. 07. 2015, 09:46:57
Vadí to dost podstatně, protože přesně takhle vznikají nedorozumění jako tato diskuze.

Eukleidovské dělení vychází z eukleidovských oborů integrity (konkrétně z okruhů celých čísel), což je dobře známá věc z algebry. Nevidím tedy, jak by to mohlo někoho mást. To, že se něco jmenuje eukleidovské ještě neznamená, že to bylo známo v době Eukleida.