Portál AbcLinuxu, 14. července 2025 21:15


Dotaz: Integer s ruznou bitovou sirkou

21.11.2011 20:10 Dannny | skóre: 14
Integer s ruznou bitovou sirkou
Přečteno: 274×
Odpovědět | Admin
Zdravim, potreboval bych definovat int (signed i unsigned variantu), ktery ma ruznou bitovou sirku. Tedy napr.:
int17 a, b;
int34 c;

a = 0x1ffff; // -1 v hexa na 17 bitech
b = 0x1ffff; // -1 v hexa na 17 bitech
c = a * b;   // melo by vyjit 1
Pocet bitu by nemel byt nicim omezen, abych mohl mit napr. 130 bitovy int. Nasel jsem pouze knihovny, ktere umoznuji libovolne velky int (napr.: gmp, mpir), coz ale neresi muj problem. Setkal se nekdo s knihovnou, ktera by toto umela?

Predem diky za nakopnuti :-)...
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.11.2011 22:05 l4m4
Rozbalit Rozbalit vše Re: Integer s ruznou bitovou sirkou
Odpovědět | | Sbalit | Link | Blokovat | Admin
GMP tvůj problém řeší, protože implementuje modulární násobení, mocnění a dělení; a modulární sčítání a odečítání snadno dosáhneš normálním sčítáním a odečítáním s následnou opravou výsledku - na které si lze celkem snadno vytvořit wrappery. Protože umožňuje obecnou modulární aritmetiku (nejen se základem 2^N), nebude to samozřejmě tak efektivní jako specializovaná knihovna.

Zápis c = a * b; ti v C nebude fungovat nikdy (kromě malých bitových šířek, které lze realizovat bitovými poli), protože nemá přetěžování operátorů.
21.11.2011 22:21 Dannny | skóre: 14
Rozbalit Rozbalit vše Re: Integer s ruznou bitovou sirkou
GMP tvůj problém řeší, protože implementuje modulární násobení, mocnění a dělení; a modulární sčítání a odečítání snadno dosáhneš normálním sčítáním a odečítáním s následnou opravou výsledku - na které si lze celkem snadno vytvořit wrappery. Protože umožňuje obecnou modulární aritmetiku (nejen se základem 2^N), nebude to samozřejmě tak efektivní jako specializovaná knihovna.

Prave jsem se ptal, jestli nekdo ty wrappery uz nenapsal, abych mohl vyuzit neco, co uz je ozkousene.
Zápis c = a * b; ti v C nebude fungovat nikdy (kromě malých bitových šířek, které lze realizovat bitovými poli), protože nemá přetěžování operátorů.
Mohu pouzit C++ (zapouzdreni do trid s operatory), ostatne gmp i mpir maji toto zapouzdreni uz implementovane.
21.11.2011 22:26 Dannny | skóre: 14
Rozbalit Rozbalit vše Re: Integer s ruznou bitovou sirkou
GMP tvůj problém řeší, protože implementuje modulární násobení, mocnění a dělení; a modulární sčítání a odečítání snadno dosáhneš normálním sčítáním a odečítáním s následnou opravou výsledku - na které si lze celkem snadno vytvořit wrappery. Protože umožňuje obecnou modulární aritmetiku (nejen se základem 2^N), nebude to samozřejmě tak efektivní jako specializovaná knihovna.
btw. mohl by si mi prepsat muj priklad do rutin gmp?
21.11.2011 22:55 l4m4
Rozbalit Rozbalit vše Re: Integer s ruznou bitovou sirkou
mpz_set_ui(a, 0x1ffff);
mpz_set_ui(b, 0x1ffff);
mpz_mul(c, a, b);
mpz_fdiv_r(c, c, BASE);
kde BASE je proměnná obsahující bázi, zde 2^34. Nebo tak něco. Celou aritmetiku se znaménky bych samozřejmě přeformuloval do neznaménkové. Sčítání, odečítání a násobení funguje automaticky a dělení se IIRC dělá násobením moduálrní inverzí (raději ověř).
22.11.2011 08:05 Dannny | skóre: 14
Rozbalit Rozbalit vše Re: Integer s ruznou bitovou sirkou
mpz_set_ui(a, 0x1ffff);
mpz_set_ui(b, 0x1ffff);
mpz_mul(c, a, b);
mpz_fdiv_r(c, c, BASE);
kde BASE je proměnná obsahující bázi, zde 2^34. Nebo tak něco. Celou aritmetiku se znaménky bych samozřejmě přeformuloval do neznaménkové. Sčítání, odečítání a násobení funguje automaticky a dělení se IIRC dělá násobením moduálrní inverzí (raději ověř).
Tak jsem si s tim pohral, ale stejne me to nedava spravne vysledky. Pokud 1:1 vezmu tvuj priklad a c bude take neznamenkovy int, tak v c je ulozen vysledek po neznamenkovem nasobeni (0x3fffc0001). Coz je sice na bitech pravda, ale v reprezentaci gmp je to chybne. Spravna -1 je v gmp ulozena jako 1 a znamenko je nastaveno na -. Navic, pokud ulozim do b 0x1, tak by vysledek mel byt -1, coz ale neni a je zde opet vysledek po neznamenkovem nasobeni 0x1ffff.

Podle me to nefunguje, nebo mi neco zasadniho unika...
22.11.2011 10:56 l4m4
Rozbalit Rozbalit vše Re: Integer s ruznou bitovou sirkou
Ano. Nepřečetl sis text pod tím kódem o převodu na neznaménkovou aritmetiku. Což je s podivem, protože jsi ho celý ocitoval...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.