Newsgroup: it.comp.lang.c++
Titolo: Lettura bit a bit dei tipi floating point...

Ciao,
ho la necessità di dover leggere bit a bit una variabile di tipo floating 
point, che sia essa float, double o long double per poter verificare i 
calcoli fatti a manina sulla rappresentazione dei numeri reali...purtroppo 
sono agli inizi del corso di Fondamenti di Informatica 1 - Facoltà di 
Ingegneria TLC e non ho grandi mezzi relativi alla programmazione!
Potreste aiutarmi?
Grazie

Se vuoi leggere il bit i-esimo di una generica variabile 'x' basta fare 
(x >> i) & 1
Maurizio


 
Ah dimenticavo... per i-esimo intendo l'iesimo bit partendo da destra e 
partendo da 0.
Maurizio


Quello che suggerisci e'  sbagliato.
Non puoi usare l'operatore shift, e nemmeno &, su dati di tipo double o
float come era richiesto. E in ogni caso non avrebbe significato.
Per fare quello che vuole lui bisogna far interpretare come intero
un numero double.
Supponiamo che (come sulla mia macchina) un numero double occupi 8 bytes.
allora (in C, perdonatemi, il C++ lo conosco poco).
potrei fare una cosa di questo tipo:
double x;
unsigned char *p;
unsigned int v;
x = 3.14159;
p=(unsigned char *)(& x);
for (int i=0; i<8; i++)
{
   v=(unsigned int) *(p+i);
   for (int j=0; j<8; j++)
      printf("%c",(v&(1U<<j) ? '1' : '0'));
   printf(" ");
}
printf("\n");
naturalmente bisogna settare opportunamente la direzione
di "scorrimento" agendo sui cicli sulla i e sulla j
(per esempio facendoli andare a rovescio.)
ciao,
g.

 E in ogni caso non avrebbe significato.
Scusa ma perche' secondo te non avrebbe significato? Cioe' e' pur sempre 
una codifica! O forse ti riferisci alla formuletta che ho usato? Perche' 
in quest'ultimo caso non sono piu' d'accordo con te.
   double x;
   char *p = (char *)(& x);
   x = 3.14159;
   for (int i=0; i<8; i++)
     {
       for (int j=0; j<8; j++)
	printf("%d", (*p >> j) & 1);
       printf(" ");
       p++;
     }

 in quest'ultimo caso non sono piu' d'accordo con te.
Scusa la bruschezza di prima. Quello che volevo dire e' che
se lo shift binario fosse applicabile ad un double immaginerei
che venisse considerato comunque come una divisione per una potenza di 2
e non  come uno shift binario (dei veri bit) perche'
shiftare i bit di un numero codificato in segnomantissaesponente
come i double porta chiaramente a risultati privi di significato.
Quindi volevo dire che se anche avessero implementato lo shift
per i double (col senso di cui sopra) allora fare l'& con 1
non porterebbe comunque a scoprire quale e' la codifica binaria,
perche' uno andrebbe sempre a testare un bit di un numero
diverso (magari sempre l'esponente) e non bit diversi del
numero originario.
ciao,
g.

 come i double porta chiaramente a risultati privi di significato.
Nessuna bruschezza... non mi sono per nulla offeso. Il problema e' che 
io considero una sequenza di bit solo una sequenza di bit... poi come 
intrepretarli, cioe' con quale codifica essi devono essere interpretati, 
per me' un altro problema. Quindi per me shitfare significa solo 
shiftare... poi se quella stringa di bit viene interpretata come intero 
e shiftare si traduce nel dividere o moltiplicare per una potenza del 
due quello e' solo un caso particolare per me.
Grazie,
Maurizio