Bitové operace ve vyšších jazycích

Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Bitové operace ve vyšších jazycích
« Odpověď #210 kdy: 08. 09. 2016, 16:00:55 »
Navíc si jsem jistý, že << není rychlejší než **.

To už záleží jen a pouze na kompileru/interpreteru a jeho optimalizacích. Na úrovni CPU je bitový posun odjakživa rychlejší. Kompilátor to může za určitých okolností zoptimalizovat a udělat z toho identický kód, ale taky může klidně teoreticky ten shift natolik zprasit, že to bude výrazně horší.


Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Bitové operace ve vyšších jazycích
« Odpověď #211 kdy: 08. 09. 2016, 16:04:13 »
jak zapíšeš jedním bitovým posunem 3**5?
a jak zapíšeš mocninou x<<n tak, aby ta samotná operace proběhla jednou instrukcí v jednom taktu?

v

Re:Bitové operace ve vyšších jazycích
« Odpověď #212 kdy: 08. 09. 2016, 16:09:39 »
To není filtr. To je jen výpočet mocniny dvojky v parametru funkce vytvářející pole.
Asi nerozumím řeči tvého kmene... To si jako představuješ, že je nějaký filtr implementovaný na jeden řádek? Viděl jsi ten kód kolem, nebo ses vůbec neobtěžoval?

Normální člověk by to napsal takto:
Takže normální je ten, kdo nepoužívá a pokud možno ani nezná bitové operace. Když je použije, tak je nenormální. Hrozná demagogie.

Pod filtrem jsem si představoval operaci, která bude praváděna mnohokrát, bude tedy dávat smysl ji optimalizovat. Ten kód co jsi poslal, spočte konstantu, vytvoří pole a po prvcích ho vydělí konstantou. Tu konstantu ale spočte jen jednou. Navíc si jsem jistý, že << není rychlejší než **.

Tobě opravdu nepřijde přirozenější zapisovat umocňování jako umocňování a ne jako bitový posun? V matematických vzorcích také píšeš 1 << N namísto 2^N?
<< je bitový posun, ** je umocnění, jedno funguje jen s celými čísly, druhé i s floating point čísly, u matematických vzorců bývá uveden "datový type"

jak zapíšeš jedním bitovým posunem 3**5?
netuším co to melete, pardon

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #213 kdy: 08. 09. 2016, 16:11:20 »
jak zapíšeš jedním bitovým posunem 3**5?
a jak zapíšeš mocninou x<<n tak, aby ta samotná operace proběhla jednou instrukcí v jednom taktu?

Tím se nemá smysl v Pythonu zabývat.

Kiwi

Re:Bitové operace ve vyšších jazycích
« Odpověď #214 kdy: 08. 09. 2016, 16:11:48 »
No, ale to jsem v podstate napsal - na urcitych pozicich a zamerenich se naopak preferuje kdyz pouzivate takove ficury jazyka, se kterymi umi delat zbytek tymu. Takove obraty v kodu, ktere jsou na prvni pohled pro vetsinu lidi na dane pozici/zamereni jasne, a pripadne budou jasne i potencionalnimu budoucimu "udrzovateli" kodu. Tomu se rika udrzovatelny kod.

Přijímejte na ty pozice profesionály a spousta takových problémů odpadne. Tady je úskalí spíše u managementu, který bývá těžké přesvědčit o tom, že amatér problémy neřeší, ale rozmnožuje, a tedy že ani 10 amatérů nikdy nevyváží jednoho profíka.
Pokud zbytek týmu neumí používat nástroje ke své práci, tak jste holt do zbytku týmu nabrali špatné lidi. Vřele doporučuji ten čas a úsilí tomu věnovat, protože jak už jsem psal výše, ačkoli je v IT neustále nedostatek lidí, i tak se vyplatí vybírat ty, kteří za něco stojí a něco umějí. Což je asi tak každý desátý, který zavolá. U lidí dodávaných personálkami se situace kupodivu stále zlepšuje.

Navíc si jsem jistý, že << není rychlejší než **.

Pokud použitý procesor nemá násobičku, tak vem jed na to, že to rychlejší je. A to tak, že podstatně.

Tobě opravdu nepřijde přirozenější zapisovat umocňování jako umocňování a ne jako bitový posun? V matematických vzorcích také píšeš 1 << N namísto 2^N?

Ano, jakožto programátorovi mi to připadá přirozenější, pokud mám implementovat výpočet v celočíselné nebo fixed-pointové aritmetice. To je právě ta otázka návyků. A naopak - vidím-li v nějakém takovém výpočtu násobení či dělení, hned to upoutá mou pozornost a přemýšlím, nejde-li to šikovněji.
Ono třeba takové Hornerovo schéma taky není tak přirozené, jako když napíšu sumu mocnin. Ale implementovat výpočet nějaké mocninné řady přesně tak, jak se zapisuje v matematice, protože to je přirozené, to je opravdu na kopanec.


gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #215 kdy: 08. 09. 2016, 16:14:28 »
To není filtr. To je jen výpočet mocniny dvojky v parametru funkce vytvářející pole.
Asi nerozumím řeči tvého kmene... To si jako představuješ, že je nějaký filtr implementovaný na jeden řádek? Viděl jsi ten kód kolem, nebo ses vůbec neobtěžoval?

Normální člověk by to napsal takto:
Takže normální je ten, kdo nepoužívá a pokud možno ani nezná bitové operace. Když je použije, tak je nenormální. Hrozná demagogie.

Pod filtrem jsem si představoval operaci, která bude praváděna mnohokrát, bude tedy dávat smysl ji optimalizovat. Ten kód co jsi poslal, spočte konstantu, vytvoří pole a po prvcích ho vydělí konstantou. Tu konstantu ale spočte jen jednou. Navíc si jsem jistý, že << není rychlejší než **.

Tobě opravdu nepřijde přirozenější zapisovat umocňování jako umocňování a ne jako bitový posun? V matematických vzorcích také píšeš 1 << N namísto 2^N?
<< je bitový posun, ** je umocnění, jedno funguje jen s celými čísly, druhé i s floating point čísly, u matematických vzorců bývá uveden "datový type"

jak zapíšeš jedním bitovým posunem 3**5?
netuším co to melete, pardon

sorry, špatně jsem to přečetl. Stejně není pravda, že ** funguje s floating point. Pokud jsou operandy celočíselné.

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #216 kdy: 08. 09. 2016, 16:20:14 »
Navíc si jsem jistý, že << není rychlejší než **.
Pokud použitý procesor nemá násobičku, tak vem jed na to, že to rychlejší je. A to tak, že podstatně.

Na kterém takovém procesoru funguje scipy? Navíc je to úplně jedno, ta operace se provede jen jednou, oproti následnému dělení N << J čísel je to zanedbatelné.

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #217 kdy: 08. 09. 2016, 16:23:17 »
Ano, jakožto programátorovi mi to připadá přirozenější, pokud mám implementovat výpočet v celočíselné nebo fixed-pointové aritmetice. To je právě ta otázka návyků. A naopak - vidím-li v nějakém takovém výpočtu násobení či dělení, hned to upoutá mou pozornost a přemýšlím, nejde-li to šikovněji.
Ono třeba takové Hornerovo schéma taky není tak přirozené, jako když napíšu sumu mocnin. Ale implementovat výpočet nějaké mocninné řady přesně tak, jak se zapisuje v matematice, protože to je přirozené, to je opravdu na kopanec.

Kopejte si do svých kolegů jak chcete. Každopádně ztrácíte čas optimalizací, kde to nedává smysl.

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #218 kdy: 08. 09. 2016, 16:28:05 »
Tento thread mě děsí. Pro všechy frikulíny, operace
Kód: [Vybrat]
N * (1 << J)
N ** 2 * J
NEJSOU EKVIVALENTNÍ.

Protože:
Kód: [Vybrat]
>>> 2 * 2 ** 4.2
36.75834735990512
>>> 2 * (1 << 4.2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'int' and 'float'

Ten kód je napsaný naprosto správně, protože J MUSÍ být integer, jinak ten algoritmus nemá smysl a má skončít chybou. Autor to má správně a přepsáním byste ten kód úplně rozbili, bohužel to nejste schopni pochopit, protože nechápete bitové operace...

v

Re:Bitové operace ve vyšších jazycích
« Odpověď #219 kdy: 08. 09. 2016, 16:29:57 »
sorry, špatně jsem to přečetl. Stejně není pravda, že ** funguje s floating point. Pokud jsou operandy celočíselné.
právě, že posun s fp nefunguje, viz gamer Dnes v 16:28:05

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #220 kdy: 08. 09. 2016, 16:31:19 »
Tento thread mě děsí. Pro všechy frikulíny, operace
Kód: [Vybrat]
N * (1 << J)
N ** 2 * J
NEJSOU EKVIVALENTNÍ.

Protože:
Kód: [Vybrat]
>>> 2 * 2 ** 4.2
36.75834735990512
>>> 2 * (1 << 4.2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'int' and 'float'

Ten kód je napsaný naprosto správně, protože J MUSÍ být integer, jinak ten algoritmus nemá smysl a má skončít chybou. Autor to má správně a přepsáním byste ten kód úplně rozbili, bohužel to nejste schopni pochopit, protože nechápete bitové operace...

J je parametr té funkce. Jeho datový typ by se měl kontrolovat na začátku, případně anotací.

v

Re:Bitové operace ve vyšších jazycích
« Odpověď #221 kdy: 08. 09. 2016, 16:32:50 »
Tento thread mě děsí. Pro všechy frikulíny, operace
Kód: [Vybrat]
N * (1 << J)
N ** 2 * J
NEJSOU EKVIVALENTNÍ.

Protože:
Kód: [Vybrat]
>>> 2 * 2 ** 4.2
36.75834735990512
>>> 2 * (1 << 4.2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'int' and 'float'

Ten kód je napsaný naprosto správně, protože J MUSÍ být integer, jinak ten algoritmus nemá smysl a má skončít chybou. Autor to má správně a přepsáním byste ten kód úplně rozbili, bohužel to nejste schopni pochopit, protože nechápete bitové operace...

J je parametr té funkce. Jeho datový typ by se měl kontrolovat na začátku, případně anotací.
to není pythonické :D

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #222 kdy: 08. 09. 2016, 16:36:16 »
sorry, špatně jsem to přečetl. Stejně není pravda, že ** funguje s floating point. Pokud jsou operandy celočíselné.
právě, že posun s fp nefunguje, viz gamer Dnes v 16:28:05

Nic takového nepsal. Píšu, že 2**J pro celočíselné J je to stejné jako 1 << J. V pythonu jsou celá čísla neomezená. Bity při posunu nemají kam utéct. Vždy to vrátí stejný výsledek.

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #223 kdy: 08. 09. 2016, 16:38:33 »
Tento thread mě děsí. Pro všechy frikulíny, operace
Kód: [Vybrat]
N * (1 << J)
N ** 2 * J
NEJSOU EKVIVALENTNÍ.

Protože:
Kód: [Vybrat]
>>> 2 * 2 ** 4.2
36.75834735990512
>>> 2 * (1 << 4.2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'int' and 'float'

Ten kód je napsaný naprosto správně, protože J MUSÍ být integer, jinak ten algoritmus nemá smysl a má skončít chybou. Autor to má správně a přepsáním byste ten kód úplně rozbili, bohužel to nejste schopni pochopit, protože nechápete bitové operace...

J je parametr té funkce. Jeho datový typ by se měl kontrolovat na začátku, případně anotací.
to není pythonické :D

Na to kašlu.

gl

Re:Bitové operace ve vyšších jazycích
« Odpověď #224 kdy: 08. 09. 2016, 16:40:36 »
Pythonické je nezabývat se tím, jestli je něco pythonické.