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?!
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;
}
É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?
Lebegőpontos szorzás. Hátha segít.
"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. :(
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
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...
}
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!