Kezdőoldal » Számítástechnika » Programozás » Valaki esetleg nem tudja,...

Valaki esetleg nem tudja, hogy hogyan lehet bitműveletekkel kiszámolni 2 x-edik hatványát bármely valós (nem túl nagy) x-re?!

Figyelt kérdés

Lebegőpontos (egyszeres pontosságú) kimenetre, illetve n paraméterre kellene megoldanom, szóval a 2 << (n-1) nem működne.

Ráadásul az is megkötés a háziban, hogy nem használhatok sem ciklust, sem elágazást.


Egyetlen oldalt találtam eddig, ahol egy hasonló dolog került megválaszolásra, de ott b/2^x volt a kérdés, amihez meg ismét ismerni kéne az 1/x bitműveletekkel való implementálását, amit szintén nem találok sehol a Google-ben.

Angol találatoknál mindenhol csak az van, hogy hogy lehet egy számról leellenőrizni, hogy 2^x-edik hatványa -- azt bezzeg sehol, hogy konkrétan 2^x-et hogy lehet bitműveletekkel kiszámolni ~ (tipikus használhatatlan blogbejegyzések).


Kérlek, segítsetek! A bitműveletekhez ilyen szinten síkhülye vagyok... :(


Egyébként meg erre azért lenne szükségem, hogy a szorzást és az osztást fel tudjam írni bitműveletekkel úgy, hogy nem használok for, while, vagy do-while ciklust, sem rekurziót (csak szekvenciát használhatok, meg függvénymeghívásokat). :(


Az általam talált 1/2^x számolását felírom ide, hátha ez alapján valaki tudna segíteni. Előre is köszönöm!


float Pow2(int x, int n) {

float y = (float)x;

unsigned int z = *((unsigned int *)&y);

unsigned int exponent = z & 0x7f800000;

exponent -= (n << 23);

z = z & ~0x7f800000 | exponent;

y = *(float *)&z;

return y;

}



2013. nov. 15. 14:33
 1/9 anonim ***** válasza:
100%
bármilyen bináris számot balra léptetsz az kettővel való szorzás. 2szer lépteted balra 2^2. 8szor lépteted balra az 2^8. önmagában a jobbra tolás kettő hatványozása.
2013. nov. 15. 14:39
Hasznos számodra ez a válasz?
 2/9 anonim ***** válasza:
100%
a balra léptetés*
2013. nov. 15. 14:39
Hasznos számodra ez a válasz?
 3/9 anonim ***** válasza:

Én is hót hülye vagyok az ilyen szintű bitműveletekhez, de az nem segít, hogy


pl.: 2^2.5 = (2^2)*(2^0.5)


Az, hogy sem ciklust, sem rekurziót nem használhatsz elég fura. Van így egyáltalán megoldása a feladatnak?

2013. nov. 15. 14:57
Hasznos számodra ez a válasz?
 4/9 anonim ***** válasza:
Úgy értettem, hogy x lehet tört szám is.
2013. nov. 15. 14:59
Hasznos számodra ez a válasz?
 5/9 anonim ***** válasza:

Lebegőpontos szorzás. Hátha segít.

[link]

2013. nov. 15. 15:44
Hasznos számodra ez a válasz?
 6/9 A kérdező kommentje:

"2^2.5 = (2^2)*(2^0.5)"


Na, és akkor ebből pl. hogyan számolnád Te ki a 2 ^ 0.5-t BITMŰVELETEKKEL.

Illetve azt még félig ki lehet számolni a Quake 3-ból vett kóddal (bizonyos pontatlansággal), BÁR ahhoz is tudni kéne akkor még implementálni a reciprokszámolást, MÉGHOZZÁ lebegőpontos számokra, DE:

például ezt akkor hogy bontod fel ??? :


2^log(3, 7)


És EMLÍTETTEM, hogy a hatványkitevő MINDENKÉPP lebegőpontos, azaz a C-ben "float" típusú, tehát egy egyszerű bittolás NEM lesz jó.



Egyébként meg azért tudom csak szekvenciában írni a kódot, mert az egészet először papíron tevékenységsorozatban kell felrajzoljam, a tanár pedig nem mutatta, nekem pedig gőzöm nincs arról, hogy tevékenységsorozat ábrájában hogyan lehet ciklust, és ezzel együtt feltételes elágazást egyértelműen jelölni. :(

2013. nov. 15. 20:31
 7/9 anonim ***** válasza:
ja kimaradt a kitevő lebegőpontos így már egész remek tyű hát egyébként hol kaptad ezt a feladatot?:D
2013. nov. 16. 01:24
Hasznos számodra ez a válasz?
 8/9 anonim ***** válasza:

nemtom mi az a tevékenység sorozat, remélem folyamat ábra vagy amit ez a pdf amit linkelek struktogramnak nevez:

ftp://www.ganziskola.hu/SzaboR/14g/progleir_Struktogram_folyamatabra.pdf

ha a tevékenység sorozat a kettő közül az egyik akkor már használhatsz ciklust meg elágazást viszont ettől függetlenül jó feladat

2013. nov. 16. 01:32
Hasznos számodra ez a válasz?
 9/9 A kérdező kommentje:

Ahh, szép is lenne .... ez sajnos folyamatábra, távolról sem az a tevékenység sorozat, ami nekem kell.

Egy nagyon-nagyon egyszerű példán szemléltetve, így néz ki az a bizonyos tevékenységszerkezet : [link]


Egyébként egyetlen dolog hiányzik az egészhez szerintem, amivel működne a dolog : ha bitműveletekkel implementálni tudnám a 2-es alapú logaritmusszámolást LEBEGŐPONTOS kimeneten, onnantól ki tudnám számolni az 1/x-et, onnantól a már meglévő kóddal a 2^x-et, onnan pedig a szorzást, azt csá.... csakhogy itt a leggyengébb láncszem a lebegőpontos logaritmus : integer paraméterrel, DE LEBEGŐPONTOS visszatérési értékkel.

És persze mit ad Isten, persze hogy ennek csak az ellentetjét találtam meg : lebegőpontos paraméter, DE integer visszatérési érték -> hogy a fene egye meg >( [persze érthető, mivel a nekem szükséges fordítottja valószínűleg jóval nehezebb].

Ez egyébként eddig így néz ki (amit találtam):


int Log2(float v) {

int c;

c = *(int*) &v;

c = (c >> 23) - 127;

return c;

}


És ezt kéne olyanra, hogy:


float Log2(float v) {

.... itt kéne lennie a kizárólag bitműveletekkel és szekvenciaként írt logaritmusszámoló kódnak...

}

2013. nov. 16. 02:46

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!