Newsgroup: it.istruzione.universita.ingegneria
Titolo: [JAVA...MAH!]STAMPARE I BIT DI UN DOUBLE

Ciao a tutti,
devo fare un esercizio che stampi i bit di un numero double. Per far ciò uso
il metodo Double.doubleToLongBits() che ritorna un long dato che gli
operatori bit a bit possono essere utilizzati solo con gli int
(long,short...ecc) e i char. I Double in java sono rappresentati secondo la
regola IEEE 754 che prevede la distribuzione dei 64 bit previsti per il
double in:
1 bit per il segno (il più significativo: bit 63)
11 bit per l'esponente (bits 52-62)
52 bit per la mantissa (bits 0-51)
Per far ciò ho fatto questo programma prendendo come esempio il numero 5
Voi ora direte...si...ma qual è il problema?? un attimino ancora e lo
saprete :-)
----->N.B.: se invece di un double passo un int il programma funziona alla
perfezione!
public class Stampabit{
 public static void main(String args[]){
          double numero=5;
          stampabit(numero);
 }
 public static void stampabit(long n){
      int b;
      int num[]=new int[64];
      for(int i=63;i>=0;i--){
               if(  ((1L<<i)&n) !=0)
                        b=1;
               else
                        b=0;
              System.out.print(b);
              //in 63 c'è il bit di segno
               num[i]=b;  //memorizzo tutti i bit nell' array num
              }
           System.out.println();
//Faccio visualizzare i campi del double separati....tanto per maggiore
chiarezza di lettura
          System.out.println("Segno = "+num[63]);
          //Stampo a video solo la parte dell'esponente
          System.out.print("Esponente = ");
          for(int i=62;i>=52;i--)
               System.out.print(num[i]);
         //Stampo a video solo la parte dell'esponente
        System.out.print("\nMantissa = ");
        for(int i=51;i>=0;i--)
               System.out.print(num[i]);
        System.out.println();
  }
 //Questo metodo mi consente di "convertire" un double in un long
 public static void stampabit (double n){
  stampabit(Double.doubleToLongBits(n));
 }
} //chiude la dichiarazione della classe Stampabit
Ciò che mi viene stampato è:
0100000000010100000000000000000000000000000000000000000000000000
Segno = 0
Esponente = 10000000001
Mantissa = 0100000000000000000000000000000000000000000000000000
l'esponente è in forma polarizzata ed equivale a 1025 - 1023 = 2
La Mantissa equivale a 2251799813685248
ora....
che relazione c'è tra questi NUMERAZZI e il mio misero 5????????????????????
Grazie mille a coloro che riusciranno a capirci qualcosa
BUON NATALE!
Roberto
--
--------------------------------------------------
Ci sono 10 tipi di persone al mondo:
quelli che capiscono il codice binario e quelli che non lo capiscono.

 La Mantissa equivale a 2251799813685248
E qui casca l'asino!
Quei bit sono si da leggere come:
Mantissa = 0100000000000000000000000000000000000000000000000000
Ma i conti vanno fatti pensando che il valore inteso e':
Mantissa = 1 .0100[...]
che in decimale viene... 1.2500000000000000! Sorpresona!
Il valore diventa quindi:
1.25*2^2 -> 5!
Fai una ricerca con gugol mettendo dentro il nome dello standard e la
parola 'double' e troverai spiegazioni piu' che esaurienti ;)
Buone vacanze! :)
-- 
A.
'There's no place like 127.0.0.1'

 1.25*2^2 -> 5!
effettivamente hai pienamente ragione!!! ora ricordo....cmq mi sa che domani
dň un'occhiata al libro di "architettura dei calcolatori" tanto per
ripassare tutta sta roba!
Grazie mille!!!!!!!!

 1.25*2^2 -> 5!
una cosa però....non capisco l'uguaglianza 1 .0100[...](in base
2)==1.2500000000000000(in base 10)
Sarà che sono momentaneamente rincretinito ma non la capisco proprio. un
aiutino? :-)

 un aiutino? :-)
Effettivamente detta cosi' e' un po' una porcata (per usare un
eufemismo...).
La faccio facile e poco professionale (eeeeee).
Tu sai che, nel nostro sistema di numerazione posizionale, ogni cifra
ha un valore pari a cifra x base^(PosizionePartendoDalloZero),
cosicche' il 5 di 53 vale 50, e l'1 di 0100 vale 4. Nel caso in
questione il primo 1  *1*.010 essendo in posizione 0 vale 1 anche in
base 10, e fin qua dovremmo essere d'accordo. Le altre cifre stanno a
*destra* per cui la loro 'posizione' la possiamo allegramente
considerare negativa. Cosi', allo stesso modo in cui il 3 di 0.53 vale
3 x 10^(-2) l'1 dopo la virgola nel nostro numero varra' 1 x 2^(-2) =
1/4 = 0.25 in decimale. Ricordandoci dell'altro uno, ci torna che il
numero e' uguale a 1+0.25=1.25 :)
Ciaaaps
-- 
A.
2 + 2 = 5
(for extremely large values of 2).

 2)==1.2500000000000000(in base 10)
1,01(2) = 1(2) + 0,01(2) = 1(10) + 1/4(10) = 1,25(10)
poiché
0,1(2) = 1/2(10)
0,01(2) = 1/4(10)
Ciao
Matteo
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it/imsv/