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

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #345 kdy: 09. 09. 2016, 15:37:09 »
Staci spravit nejake matematicke operacie, a ked clovek caka 3, ma 2.99999999999 a je v pr...
A kde se v tom mém kódu takové operace dělají? Může je dělat jen Math.pow, což je černá skříňka, nicméně pro potřeby toho elementárního příkladu funguje dobře.

Dost ale řečí, kritizovat umí každý, dej sem svůj kód, který bude lepší a pořád dostatečně jednoduchý.


Kit

Re:Bitové operace ve vyšších jazycích
« Odpověď #346 kdy: 09. 09. 2016, 15:41:18 »
nejde 2 na celé číslo v iee754 vyjádřit přesně?

Staci spravit nejake matematicke operacie, a ked clovek caka 3, ma 2.99999999999 a je v pr...

Které? Sčítání, odčítání, násobení a dokonce v mnohých případech i dělení je bezproblémové.

balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #347 kdy: 09. 09. 2016, 15:47:49 »
nejde 2 na celé číslo v iee754 vyjádřit přesně?
Jde. Nicméně i tak má ten kód svoje problémy. Balki se akorát chytil elementárního příkladu, který se snažil být co nejjednodušší. Tak jsem zvědavý, jak to udělá lepší.

BigInteger ma metodu pow a metodu equals. Tak by som to zriesil cez to.

Kód: [Vybrat]
import java.math.BigInteger;

class Javaman
{
    public static void main(String[] args)
    {
        if (!pow(62).equals(shift(62)))
        {
            System.out.println("javaman je borec");
        }
        if (!pow(63).equals(shift(63)))
        {
            System.out.println("javaman je lopata");
        }
    }

    public static BigInteger pow(long exponent)
    {
        BigInteger dva = BigInteger.valueOf(2);
        return dva.pow((int)exponent);
    }

    public static BigInteger shift(long exponent)
    {

        long hovno = 1L << exponent;
        return BigInteger.valueOf(hovno);

    }
}

Ospravedlnujem sa za ten casting long na int, no furt lepsie, nez porovnavat double.

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #348 kdy: 09. 09. 2016, 15:53:24 »
Ospravedlnujem sa za ten casting long na int, no furt lepsie, nez porovnavat double.
Takže casting tam máš, jediné čeho ses zbavil je porovnání doublů, které se dají reprezentovat přesně a máš tam konstrukce typu:
Kód: [Vybrat]
f (!pow(62).equals(shift(62)))
místo
Kód: [Vybrat]
if (pow(62) != shift(62))

No nevím, podle vkusu každého soudruha. Podle mě by měly být elementární příklady co nejjednodušší.

Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Bitové operace ve vyšších jazycích
« Odpověď #349 kdy: 09. 09. 2016, 15:57:26 »
Už mě to asi přestává bavit pořád dokola.

Nikoho do bitových operací nenutím, jen si myslím, že patří k základním znalostem každého člověka, motajícího se kolem IT.

Kde je použít a kde je nepoužít, to záleží z velké části na zkušenostech, ne vždy jsou vhodné, ne vždy udělají to, co od nich motyka očekává, ale to už je na posouzení každého.

Pokud potřebuju celočíselnou hodnotu vynásobit mocninou dvojky, většinou to automaticky řeším posunem a zápis x*8 a x<<3 vidím úplně stejně, aniž bych nad tím musel přemýšlet, ale to je dáno několika lety assembleru a nemusí to tak mít každý.

Realita je taková, že pokud se nesnažíme vymýšlet syntetické příklady, kam bitové operace lámeme přes koleno, tak většinou prostě posun JE rychlejší, ale pokud se operace provádí jednou za 10 minut, když někdo otevře nějakou stránku, tak je to úplně jedno a nepřipadne mi ani na jedné variantě vůbec nic divnýho.

Pokud operaci provádím ve smyčce na místě, kde je rychlost kritická, pak se podle mě není o čem bavit a každý, kdo něco takového má potřebu někdy provádět, tak to prostě musí zvládnout ve tři ráno po tahu. Ostatní musí být schopní takový kód s určitým úsilím přečíst a když nejsou, tak jsou to buď lopaty, motyky, nebo javaman.


balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #350 kdy: 09. 09. 2016, 15:57:36 »
Ospravedlnujem sa za ten casting long na int, no furt lepsie, nez porovnavat double.
Takže casting tam máš, jediné čeho ses zbavil je porovnání doublů, které se dají reprezentovat přesně a máš tam konstrukce typu:
Kód: [Vybrat]
f (!pow(62).equals(shift(62)))
místo
Kód: [Vybrat]
if (pow(62) != shift(62))

No nevím, podle vkusu každého soudruha. Podle mě by měly být elementární příklady co nejjednodušší.

Double sa neporovnavaju != , bodka.

balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #351 kdy: 09. 09. 2016, 15:58:50 »
nejde 2 na celé číslo v iee754 vyjádřit přesně?

Staci spravit nejake matematicke operacie, a ked clovek caka 3, ma 2.99999999999 a je v pr...

Které? Sčítání, odčítání, násobení a dokonce v mnohých případech i dělení je bezproblémové.

Napada mi z fleku acos(cos(1)) , toto nebude presne ani v pythone.

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #352 kdy: 09. 09. 2016, 16:02:18 »
Double sa neporovnavaju != , bodka.

Někdy to jde a ta operace je naprosto přesně definovaná a bezpečná. Pokud se toho bojíš a nedokážeš domyslet kdy, tak si je neporovnávej, mně je to jedno. Mimochodem ten tvůj příklad tak úplně nefunguje:
Kód: [Vybrat]
return dva.pow((int)exponent);
pow na BigIntu není definované pro záporný exponent. Ten můj příklad funguje i pro záporný exponent. Oprav to.

balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #353 kdy: 09. 09. 2016, 16:04:05 »
Double sa neporovnavaju != , bodka.

Někdy to jde a ta operace je naprosto přesně definovaná a bezpečná. Pokud se toho bojíš a nedokážeš domyslet kdy, tak si je neporovnávej, mně je to jedno. Mimochodem ten tvůj příklad tak úplně nefunguje:
Kód: [Vybrat]
return dva.pow((int)exponent);
pow na BigIntu není definované pro záporný exponent. Ten můj příklad funguje i pro záporný exponent. Oprav to.

Heh, skoda casu.

Kit

Re:Bitové operace ve vyšších jazycích
« Odpověď #354 kdy: 09. 09. 2016, 16:04:30 »
nejde 2 na celé číslo v iee754 vyjádřit přesně?

Staci spravit nejake matematicke operacie, a ked clovek caka 3, ma 2.99999999999 a je v pr...

Které? Sčítání, odčítání, násobení a dokonce v mnohých případech i dělení je bezproblémové.

Napada mi z fleku acos(cos(1)) , toto nebude presne ani v pythone.

Výsledkem funkce cos(1) není celé číslo. Nesplňuje to tedy vstupní podmínku.

balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #355 kdy: 09. 09. 2016, 16:09:11 »
nejde 2 na celé číslo v iee754 vyjádřit přesně?

Staci spravit nejake matematicke operacie, a ked clovek caka 3, ma 2.99999999999 a je v pr...

Které? Sčítání, odčítání, násobení a dokonce v mnohých případech i dělení je bezproblémové.

Napada mi z fleku acos(cos(1)) , toto nebude presne ani v pythone.

Výsledkem funkce cos(1) není celé číslo. Nesplňuje to tedy vstupní podmínku.

No lebo vysledkom operacii je vzdy 2^n...

Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Bitové operace ve vyšších jazycích
« Odpověď #356 kdy: 09. 09. 2016, 16:50:19 »
Zajímavé... debata o binárních operacích se plynule zvrtla v debatu o neschopnosti posoudit vhodnost libovolného postupu v libovolné situaci. To už si asi děláte srandu, ne? Snad pokud pracuju s celými čísly, tak to dělám tak, aby mi vždy vyšlo celé číslo. Nebo je tu někdo, kdo raději na každou kravinu používá double "pro jistotu", aby náhodou 1+1 nebylo 1.999999999?
A co by pánové řekli na špeky typu:

Kód: [Vybrat]
int x=5;
int y=10;
int z=(x/10)*y;

a

Kód: [Vybrat]
int x=5;
int y=10;
int z=(x*y)/10;

Závorky jsou tam navíc, vím o tom, ale aby se někdo nemusel učit priority operací, který nikdy předtím nepotřeboval, tak jsem je tam pro názornost dal.

A jakej bude asi výsledek?

gamer

Re:Bitové operace ve vyšších jazycích
« Odpověď #357 kdy: 09. 09. 2016, 17:01:57 »
Heh, skoda casu.
Takže to shrnem, měl do být elementární příklad a dodal jsi kód, který je delší, složitější, méně přehledný a nefunguje (a to tak, že vůbec) pro záporný exponent. Gratuluji. Opravdu škoda času.

balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #358 kdy: 09. 09. 2016, 17:02:31 »
Zajímavé... debata o binárních operacích se plynule zvrtla v debatu o neschopnosti posoudit vhodnost libovolného postupu v libovolné situaci. To už si asi děláte srandu, ne? Snad pokud pracuju s celými čísly, tak to dělám tak, aby mi vždy vyšlo celé číslo. Nebo je tu někdo, kdo raději na každou kravinu používá double "pro jistotu", aby náhodou 1+1 nebylo 1.999999999?
A co by pánové řekli na špeky typu:

Kód: [Vybrat]
int x=5;
int y=10;
int z=(x/10)*y;

a

Kód: [Vybrat]
int x=5;
int y=10;
int z=(x*y)/10;

Závorky jsou tam navíc, vím o tom, ale aby se někdo nemusel učit priority operací, který nikdy předtím nepotřeboval, tak jsem je tam pro názornost dal.

A jakej bude asi výsledek?

Prve bude z=0.

To druhe je nejaky chytak, tam mi vychaza z=5.

balki

Re:Bitové operace ve vyšších jazycích
« Odpověď #359 kdy: 09. 09. 2016, 17:04:53 »
Heh, skoda casu.
Takže to shrnem, měl do být elementární příklad a dodal jsi kód, který je delší, složitější, méně přehledný a nefunguje (a to tak, že vůbec) pro záporný exponent. Gratuluji. Opravdu škoda času.

Dobre ze ta nepoznam, ty budes nejaky blbsi.