Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Star Wars Zero Company è l'erede di XCOM 2
Star Wars Zero Company è l'erede di XCOM 2
Bit Reactor porta nell’universo di Star Wars una struttura tattica che richiama apertamente XCOM 2, ma la arricchisce con legami tra i personaggi, progressione ruolistica, gestione della base e un sistema di combattimento costruito attorno a tre Punti Azione e alle risorse condivise della squadra
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
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 developer – SCJP 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 developer – SCJP 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 developer – SCJP 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 developer – SCJP 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


Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Sovranità sui dati: AWS è ...
Il nuovo nome della distro Linux mobile ...
Due ventole da 220 mm e non solo: Cooler...
Truffa telefonica via Google Ads: il bro...
Google pensiona le Gems di Gemini: cosa ...
Flight 14: incertezza per un problema a ...
C'è un problema con i robot Tesla: i dip...
Raggi gamma anomali dalla Via Lattea sve...
NIO vende il 30% della divisione scambio...
Sony brevetta un DualSense capace di acc...
Un volto per l'assistenza IA: cosa pu&og...
NVIDIA autorizza un buyback da 150 milia...
Come il T-1000 di Terminator 2: circuiti...
Cloudflare: risolto il bug di memoria ch...
Lunex spegne gli antivirus con un driver...
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:00.


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