| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  21-02-2007, 11:55 | #1 | 
| Member Iscritto dal: Jan 2007 
					Messaggi: 112
				 | 
				
				floating point, virgola mobile in (c)
			 
		sto cercando di rappresentare il codice binario di un float.  con operatori bitwise ma qundo lo compilo mi dice invalid operands to binary & invalid operands to binary >> chi mi può dare una mano? con gl'interi nn me lo fa grazie mille Codice: #include <stdio.h>
#include <stdlib.h>
#define n_len 32
void rappr_float(float n);
int main()
{
float a=36.25f;
printf("%.2f\n",a);
rappr_float(a);
system ("pause");
return 0;
}
void rappr_float(float n)
{
int i=n_len,bit[n_len];
do{
  bit[i]=n&1;
  i--;
  n=n>>1;
  }while(n!=0 && i>=0);
  
if(i>0)
 do{
   bit[i]=0;
   i--;
   }while(i>=0);
for(i=0;i<n_len;i++)
   pritnf("%d",bit[i]);
} | 
|   |   | 
|  21-02-2007, 12:13 | #2 | 
| Senior Member Iscritto dal: Jul 2006 Città: Tristram 
					Messaggi: 517
				 | 
		Non è possibile utilizzare gli operatori bitwise con i float. Ti dò anche una spiegazione tecnica: i float vengono processati nella fpu, mentre gli operatori bitwise sono normali operazioni della cpu (and,shl,shr eccetera), per cui agiscono solo sui registri della cpu e non su quelli della fpu
		 
				__________________ Il sole è giallo | 
|   |   | 
|  21-02-2007, 12:19 | #3 | 
| Member Iscritto dal: Jan 2007 
					Messaggi: 112
				 | 
		ok grazie  ecome potrei fare
		 | 
|   |   | 
|  21-02-2007, 12:28 | #4 | 
| Senior Member Iscritto dal: Jul 2006 Città: Tristram 
					Messaggi: 517
				 | 
		O usi un altro tipo semplice per la tua rappresentazione, che supporti gli operatori bitwise (ad esempio gli int) o usi una struttura e ti riscrivi delle funzioni che "simulino" i bitwise
		 
				__________________ Il sole è giallo | 
|   |   | 
|  21-02-2007, 12:35 | #5 | 
| Member Iscritto dal: Jan 2007 Città: Napoli 
					Messaggi: 89
				 | 
		Potresti usare la union. In questo modo fai condividere la stessa porzione di memoria a due variabili di tipo diverso. Nel tuo caso una float e un'altra int (o long se int è meno di 4 byte). Inserisci il valore come float e lavora con il tipo intero per applicare gli operatori bitwise.   | 
|   |   | 
|  21-02-2007, 13:07 | #6 | 
| Senior Member Iscritto dal: Nov 2005 Città: TO 
					Messaggi: 5206
				 | 
		Si potrebbe fare così: Codice: #include <stdio.h>
void print_bin_float (float f)
{
    unsigned int m, n = *((unsigned int*) &f);
    for (m = 1<<31; m != 0; m >>= 1)
        printf (n & m ? "1" : "0");
    printf ("\n");
}
int main (void)
{
    float a = 1.23f;
    print_bin_float (a);
    return 0;
}
				__________________ Andrea, SCJP 5 (91%) - SCWCD 5 (94%) | 
|   |   | 
|  21-02-2007, 13:58 | #7 | |
| Senior Member Iscritto dal: May 2006 Città: Wursteland 
					Messaggi: 1749
				 | Quote: 
  in caso di sistemi in cui int e float son diversi puoi usare un unsigned char * e scorrere byte per byte il float: Codice: void print_bin_float (float f)
{
   unsigned char *pC;
   int k, i;
   for (pC = (unsigned char *)&f, i = 0; i < sizeof(float); pC++, i++)
      for (k = 7; k >= 0; k--)
         printf ("%d", *pC & (1 << k)? 1 : 0);
   printf ("\n");
}
				__________________ Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve | |
|   |   | 
|  21-02-2007, 14:26 | #8 | |
| Senior Member Iscritto dal: Nov 2005 Città: TO 
					Messaggi: 5206
				 | Quote: 
 Codice: void print_bin_float (float f)
{
    char *p = (char*) &f;
    int i, m;
    for (i = sizeof(float)-1; i >= 0; i--)
        for (m = 128; m != 0; m >>= 1)
            printf (p[i] & m ? "1" : "0");
    printf ("\n");
}Il mio codice è per una macchina little-endian, il tuo codice l'hai scritto per una macchina big-endian. 
				__________________ Andrea, SCJP 5 (91%) - SCWCD 5 (94%) | |
|   |   | 
|  21-02-2007, 14:49 | #9 | |
| Senior Member Iscritto dal: May 2006 Città: Wursteland 
					Messaggi: 1749
				 | Quote: 
 Mi ricordo il porting da Tandem a Unix un continuo swap 
				__________________ Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve | |
|   |   | 
|  21-02-2007, 14:53 | #10 | 
| Bannato Iscritto dal: Dec 2006 Città: patente 30 e lode 
					Messaggi: 131
				 | 
		la butto lì, ma non conviene passare per l'esadecimale ?    | 
|   |   | 
|  21-02-2007, 15:04 | #11 | |
| Senior Member Iscritto dal: Nov 2005 Città: TO 
					Messaggi: 5206
				 | 
		
Uhm ... non so se c'è una macro predefinita "standard" per questo ... non credo. Stavo guardando adesso le macro predefinite di un gcc 3.2.3 ma non trovo nulla di utile. Quote: 
 Codice: #ifdef BIG_ENDIAN
    for (i = 0; i < sizeof(float); i++)
#else
    for (i = sizeof(float)-1; i >= 0; i--)
#endif
				__________________ Andrea, SCJP 5 (91%) - SCWCD 5 (94%) | |
|   |   | 
|  21-02-2007, 15:16 | #12 | |
| Senior Member Iscritto dal: May 2006 Città: Wursteland 
					Messaggi: 1749
				 | Quote: 
 #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 e questo  #define __PDP_ENDIAN 3412 
				__________________ Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve | |
|   |   | 
|  21-02-2007, 15:34 | #13 | 
| Senior Member Iscritto dal: Nov 2005 Città: TO 
					Messaggi: 5206
				 | 
		
Già .... è vero!   (sapevo di questo file  ). Comunque non è "standard", con gcc su Linux è ok ma non so se c'è una cosa simile con altri compilatori. 
				__________________ Andrea, SCJP 5 (91%) - SCWCD 5 (94%) | 
|   |   | 
|  21-02-2007, 15:41 | #14 | ||
| Senior Member Iscritto dal: May 2006 Città: Wursteland 
					Messaggi: 1749
				 | Quote: 
 #ifdef _BIG_ENDIAN ... #ifdef _LITTLE_ENDIAN quindi probabilmente é standard  ma endian.h non c'é. Ma in effetti endian.h é della GNU: Quote: 
 
				__________________ Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve | ||
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 16:05.









 
		 
		 
		 
		









 
  
 



 
                        
                        










