|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#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]);
}
|
|
|
|
|
|
#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 |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 112
|
ok grazie ecome potrei fare
|
|
|
|
|
|
#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 |
|
|
|
|
|
#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.
|
|
|
|
|
|
#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%) |
|
|
|
|
|
#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 |
|
|
|
|
|
|
#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%) |
|
|
|
|
|
|
#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 |
|
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Dec 2006
Città: patente 30 e lode
Messaggi: 131
|
la butto lì, ma non conviene passare per l'esadecimale ?
|
|
|
|
|
|
#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%) |
|
|
|
|
|
|
#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 |
|
|
|
|
|
|
#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%) |
|
|
|
|
|
#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: 17:11.












(sapevo di questo file 








