[C] lunghezza float [risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: [C] lunghezza float [risolto]

Messaggio da robbybby »

float e double a virgola mobile (e ci mancherebbe altro). Sui PC, io ho sempre visto float a 32 bit, e double a 64 bit.
Io, per confrontare due umeri in virgola mobile, di solito faccio:

Codice: Seleziona tutto

const double epsilon = 0.0001;  //questa è la max differenza che ammetti per i tuoi calcoli, e la faccio come costante globale
double dbN1 = 0;
double dbN2 = 0;

  if(fabs(dbN1 - dbN1) < epsilon)
    ...
Per gli interi, lo standard impone solo che:
short <= int <= long.
Tra l'altro, a 64 bit, Win$ e Linux hanno lunghezze differenti per gli interi. Il long è 64 bit per entrambi, non ricordo invece come siano messi short e int.

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: [C] lunghezza float [risolto]

Messaggio da sya54M »

robbybby ha scritto:float e double a virgola mobile (e ci mancherebbe altro). Sui PC, io ho sempre visto float a 32 bit, e double a 64 bit.
bravo, è quello che sapevo io.
robbybby ha scritto: Io, per confrontare due umeri in virgola mobile, di solito faccio:

Codice: Seleziona tutto

const double epsilon = 0.0001;  //questa è la max differenza che ammetti per i tuoi calcoli, e la faccio come costante globale
double dbN1 = 0;
double dbN2 = 0;

  if(fabs(dbN1 - dbN1) < epsilon)
    ...
ah ecco, il concetto è quasi quello che ho fatto io, solo che il tuo è più elegante perchè fai il valore assoluto, ci avevo provato con abs() ma ho visto che me lo troncava ad intero, perciò avevo fatto il doppio confronto, solo ora che me lo hai ricordato ho capito che abs() va bene solo in c++ e in c si usa fabs().

metrofox
Linux 3.x
Linux 3.x
Messaggi: 760
Iscritto il: gio 7 ago 2008, 12:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)
Località: London

Re: [C] lunghezza float [risolto]

Messaggio da metrofox »

La lunghezza di un double e': 8 byte, 64 bit
La lunghezza di un float e': 4 byte, 32 bit
La lunghezza di un int e': 4 byte, 32 bit
La lunghezza di un char e': 1 byte, 8 bit
La lunghezza di un void e': 1 byte, 8 bit
La lunghezza di un long e': 8 byte, 64 bit
La lunghezza di un short e': 2 byte, 16 bit
Quindi, tipi a 64bit ce ne sono 2 nei sistemi a 64bit(long e double), mentre sui sistemi a 32bit solo double.

Su un sistema a 64bit(slackware64-current-Mon Apr 5 03:06:19 UTC 2010).

Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: [C] lunghezza float [risolto]

Messaggio da robbybby »

Per le dimensioni degli interi sulle varie piattaforme ho trovato questo:
http://stackoverflow.com/questions/3845 ... it-windows

Riassumendo qui:

Codice: Seleziona tutto

Type           Linux64  Win$ 64
char             8         8
short            16        16
int              32        32
long             64        32
long long        64        64
pointer          64        64

metrofox
Linux 3.x
Linux 3.x
Messaggi: 760
Iscritto il: gio 7 ago 2008, 12:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)
Località: London

Re: [C] lunghezza float [risolto]

Messaggio da metrofox »

La lunghezza di un tipo dipende comunque dal tipo di processore, e sizeof è stato fatto apposta anche per motivi di portabilità, perciò si può anche fare un programma che tramite sizeof ne calcoli la dimensione di un tipo(in byte), come ad esempio:

Codice: Seleziona tutto

#include <stdio.h>

int main()
{

int lunghezza[8];
int i;

for(i=0; i<=7; i++){
	if (i == 0){
		lunghezza[i] = sizeof(double);
		printf("La lunghezza di un double e': \t%d byte\n", lunghezza[i]);
		}
	if (i == 1){
		lunghezza[i] = sizeof(float);
		printf("La lunghezza di un float e': \t%d byte\n", lunghezza[i]);
		}
	if (i == 2){
		lunghezza[i] = sizeof(int);
		printf("La lunghezza di un int e': \t%d byte\n", lunghezza[i]);
		}
	if (i == 3){
		lunghezza[i] = sizeof(char);
		printf("La lunghezza di un char e': \t%d byte\n", lunghezza[i]);
		}
	if (i == 4){
		lunghezza[i] = sizeof(void);
		printf("La lunghezza di un void e': \t%d byte\n", lunghezza[i]);
		}
	if (i == 5){
		lunghezza[i] = sizeof(long);
		printf("La lunghezza di un long e': \t%d byte\n", lunghezza[i]);
		}
	if (i == 6){
		lunghezza[i] = sizeof(short);
		printf("La lunghezza di un short e': \t%d byte\n", lunghezza[i]);
		}
	if (i == 7){
		lunghezza[i] = sizeof(size_t);
		printf("La lunghezza di size_t e': \t%d byte\n", lunghezza[i]);
		}
	}
return 0;
}
Basta compilare ed eseguire per vedere quanto vale un tipo specifico nel proprio processore.

Rispondi