Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
DJI Osmo Nano: la piccola fotocamera alla prova sul campo
DJI Osmo Nano: la piccola fotocamera alla prova sul campo
La nuova fotocamera compatta DJI spicca per l'abbinamento ideale tra le dimensioni ridotte e la qualità d'immagine. Può essere installata in punti di ripresa difficilmente utilizzabili con le tipiche action camera, grazie ad una struttura modulare con modulo ripresa e base con schermo che possono essere scollegati tra di loro. Un prodotto ideale per chi fa riprese sportive, da avere sempre tra le mani
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


OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati Oracle AI World 2025: l'IA cambia tutto, a parti...
Bancomat lancia Eur-Bank: la stablecoin ...
NVIDIA supera i 5.000 miliardi di dollar...
I ransomware fanno meno paura: solo un'a...
Pixel 10a si mostra nei primi rendering:...
Intel Nova Lake-S: i dissipatori delle p...
1X Technologies apre i preordini per NEO...
Tesla Cybercab cambia rotta: nel taxi de...
L'industria dell'auto europea a pochi gi...
VMware tra cloud privato e nuovi modelli...
Amazon Haul lancia il colpo di genio: pr...
Windows 11: nuova versione in arrivo a i...
Presto in arrivo anche in Italia Alexa+,...
Bill Gates cambia idea sul cambiamento c...
Diella: la parlamentare albanese basata ...
Apple dice addio ai pulsanti meccanici: ...
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: 17:11.


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