[ Space Monkey @ 07.06.2006. 08:03 ] @
kako da ispisem binarnu predstavu float-A na glavnom izlazu?
[ tosa @ 07.06.2006. 08:39 ] @
Prilično jednostavno:
Code:
int Int = *(int*)&FloatVar;
IspisiBinarniZapis(Int);

Samo obrati pažnju na veličinu tipa float, može biti različita od veličine integer-a.
[ NrmMyth @ 07.06.2006. 10:04 ] @
Zacudilo me...
Zasto ne rade bitwise operatori na double i float???
[ cynique @ 07.06.2006. 10:12 ] @
Citat:
tosa: Prilično jednostavno:
Code:
int Int = *(int*)&FloatVar;
IspisiBinarniZapis(Int);

Samo obrati pažnju na veličinu tipa float, može biti različita od veličine integer-a.


Time će izgubiti sve bitove u IEE-754 zapisu FP broja i ostat će samo njegov cjelobrojni dio.

Za cjelobrojne tipove konverzija se može najlakše obaviti ovako nekako:

Code:

    int a = 123;

    for( size_t i = sizeof(a)*8; i != -1; --i ) {
        cout << ( (a & (1 << i)) ? "1" : "0" );
    }


Problem je ukoliko je a tipa float/double, što nad njima ne postoji bitwise operator &, pa je vjerojatno moguć točan binarni ispis jedino preko nekih ružnih castova u __int64 ili neki umjetni tip koji bi bio dovoljno velik da sadrži 8-10 bajtni FP broj.
[ cynique @ 07.06.2006. 10:15 ] @
Citat:
NrmMyth: Zacudilo me...
Zasto ne rade bitwise operatori na double i float???


Jer ih šugavi x86 ne podržava, tj. ne postoji x87 ekvivalent ovih instrukcija:

http://faydoc.tripod.com/cpu/bt.htm

Dakle cast u više integera pa ispis bitova u 32-bitnim odsječcima :)
[ Mali Misha @ 07.06.2006. 10:26 ] @
A zar ne bi moglo preko char?
[ cynique @ 07.06.2006. 10:44 ] @
Odlično, baš tako - ružno i netipizirajuće, ali jebiga takav je gadni x87 FPU ;) Mislim da može i elegantnije preko kompajler intrinsika za SSE, pa ako se kome da..
[ Space Monkey @ 07.06.2006. 14:22 ] @
ljudi hvala, spasli ste me!
[ NastyBoy @ 07.06.2006. 18:18 ] @
Citat:
cynique: Time će izgubiti sve bitove u IEE-754 zapisu FP broja i ostat će samo njegov cjelobrojni dio.


Nece izgubiti nishta u sluchaju da su oba tipa iste velichine. Ono je obichan cast preko pointera, sadrzhaj memorije se ni na koji nachin ne menja, gomila bitova i dalje ostaje gomila bitova.
[ KernelPanic @ 08.06.2006. 00:12 ] @
Slažem se sa NastyBoy. Ovaj program (npr) ispisuje proverenu tačnu vrednost

Code:

#include <stdio.h>

int main()
{
    double x=2.5;
    long long* z;
    z=(long long*)(&x);
    printf ("%llX\n",(*z));
    exit(0);
}


Za ispis čistog float je dovoljno zameniti double sa float i long sa long long. Ostavio sam heksadecimalne vrednosti pošto je trivijalno odatle stići u binarno.