Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-02-2007, 10: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, 11: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, 11: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, 11: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, 11: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, 12:07   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 12: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, 13:26   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 13: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, 13: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, 14:04   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 14: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, 14:34   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2007, 14: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


Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
Costruire una VGA in casa senza un chip ...
Renault ha rifiutato due volte BYD: l'az...
Appena 9.000 imprese innovative in 25 an...
Anthropic (di nuovo) sotto accusa: chies...
HP OMEN MAX 16 con RTX 5080 e Core Ultra...
Tilly Norwood arriva al cinema: via all'...
5G slicing per le comunicazioni di emerg...
BYD SHARK, 436 CV e fino a 90 km in elet...
Quali sono i migliori produttori di tecn...
Come guardare YouTube senza pubblicit&ag...
Il telescopio spaziale europeo ESA Eucli...
Addio stampa 3D a strati: il metodo che ...
Data center ed energia green: Aruba acqu...
Windows scarica software non richiesto q...
Auto europea, Bloomberg: uno stabiliment...
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: 18:28.


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