Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-02-2007, 11:55   #1
robs05
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]);

}
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 12:13   #2
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
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
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 12:19   #3
robs05
Member
 
Iscritto dal: Jan 2007
Messaggi: 112
ok grazie ecome potrei fare
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 12:28   #4
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
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
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 12:35   #5
Michael Jennings
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.
Michael Jennings è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 13:07   #6
andbin
Senior Member
 
L'Avatar di andbin
 
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;
}
Questa soluzione però non mi piace al 100%. Presuppone che int e float abbiano la stessa dimensione (e sui sistemi a 32 bit è così).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 13:58   #7
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da andbin Guarda i messaggi
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;
}
Questa soluzione però non mi piace al 100%. Presuppone che int e float abbiano la stessa dimensione (e sui sistemi a 32 bit è così).
l'idea é buona ma se mi posso permettere di perfezionarla
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 14:26   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da trallallero Guarda i messaggi
in caso di sistemi in cui int e float son diversi puoi usare un unsigned char *
e scorrere byte per byte il float
Certo ... anche io all'inizio avevo pensato a una cosa del genere:
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");
}
Ma c'è una questione importante: se la macchina è little-endian o big-endian!!!

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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 14:49   #9
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da andbin Guarda i messaggi
Certo ... anche io all'inizio avevo pensato a una cosa del genere:
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");
}
Ma c'è una questione importante: se la macchina è little-endian o big-endian!!!

Il mio codice è per una macchina little-endian, il tuo codice l'hai scritto per una macchina big-endian.
immagino ci sia la define giusta a livello di SO. Si puó sempre swappare no ?
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 14:53   #10
++CERO++
Bannato
 
Iscritto dal: Dec 2006
Città: patente 30 e lode
Messaggi: 131
la butto lì, ma non conviene passare per l'esadecimale ?
++CERO++ è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 15:04   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da trallallero Guarda i messaggi
immagino ci sia la define giusta a livello di SO.
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:
Originariamente inviato da trallallero Guarda i messaggi
Si puó sempre swappare no ?
Mi ricordo il porting da Tandem a Unix un continuo swap
Bastarebbe mettere (facendo riferimento al mio codice):

Codice:
#ifdef BIG_ENDIAN
    for (i = 0; i < sizeof(float); i++)
#else
    for (i = sizeof(float)-1; i >= 0; i--)
#endif
E sarei a posto. Naturalmente definendo la macro BIG_ENDIAN, se su una macchina big-endian.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 15:16   #12
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da andbin Guarda i messaggi
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.
qui su linux le ho (endian.h):
#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
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 15:34   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da trallallero Guarda i messaggi
qui su linux le ho (endian.h):
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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 15:41   #14
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da andbin Guarda i messaggi
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.
vedo adesso che su Sun trovi tanti:
#ifdef _BIG_ENDIAN
...
#ifdef _LITTLE_ENDIAN
quindi probabilmente é standard

ma endian.h non c'é.

Ma in effetti endian.h é della GNU:
Quote:
/* Copyright (C) 1992, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
__________________
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
Funzionalità top a un prezzo acce...
Lo strumento per gli aggiornamenti autom...
Imperdibile sconto sul roborock Saros Z7...
Google Pixel 10, altri 100€ di sconto su...
Chip sotto i 2 nanometri, l'Europa alza ...
La smart meno smart di tutte: #6 in azio...
Red Hat Enterprise Linux sbarca su AWS E...
Addio alle migliaia di cicli e anni di t...
Colpo di STMicroelectronics, un'intesa d...
La Ferrari elettrica si chiama Luce: ecc...
Proseguono le riparazioni in vista del l...
Cinema domestico low cost: proiettore Fu...
Sharp porta a ISE 2026 i nuovi display i...
Casa più sicura senza lavori: Arl...
Batterie esauste, l'Italia raccoglie sol...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:17.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v