[ Space Monkey @ 07.06.2006. 08:03 ] @
kako da ispisem binarnu predstavu float-A na glavnom izlazu? |
[ Space Monkey @ 07.06.2006. 08:03 ] @
[ 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. Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|