[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
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:

[C] lunghezza float [risolto]

Messaggio da sya54M »

ciao, ho notato che con numeri a molti decimali, facendo con confronto con 0 mi risultano delle condizioni di 0.000000 e -0.000000 e nessuno di questi soddisfa l'uguaglianza a 0, mi è sembrato strano, ma pare che anche se non visualizza il settimo decimale con float, in realtà ne tenga conto.
a me andrebbe anche meglio fermarmi al terzo decimale per dire che sia uguale a 0, ma come faccio? sembra che vada all'infinito...
grazie mille per eventuali aiuti
Ultima modifica di sya54M il mer 14 apr 2010, 19:19, modificato 1 volta in totale.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] lunghezza float

Messaggio da targzeta »

Non ci ho capito molto, potresti fare un esempio? Al limite posta un po' di codice.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: [C] lunghezza float

Messaggio da Ansa89 »

sya54M ha scritto:a me andrebbe anche meglio fermarmi al terzo decimale per dire che sia uguale a 0, ma come faccio? sembra che vada all'infinito...
grazie mille per eventuali aiuti
Moltiplica il numero da confrontare per 100 e convertilo a intero, poi lo confronti con zero.

Comunque se il confronto fallisce vuol dire che almeno una cifra del numero da confrontare non è zero.

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: [C] lunghezza float [risolto]

Messaggio da Ansa89 »

Alla fine come hai risolto?

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 »

siccome non mi interessava una precisione a 6 decimali ma mi bastava anche a 3 o 4, ho aggirato il problema in questo modo:

Codice: Seleziona tutto

while((Qan-Qnb) >= 0.0001 || (Qan-Qnb) <= 0.00001) {
    ...
    if((Qan-Qnb) > 0)
      Yn = Yn+0.01;
    else if((Qan-Qnb) < 0)
      Yn = Yn-0.01;
    printf("deltaQ: %f\n", Qan-Qnb);
}
return Yn;
Ansa89 ha scritto:Moltiplica il numero da confrontare per 100 e convertilo a intero, poi lo confronti con zero.
anche questa era una soluzione, ma ho già fatto, grazie comunque
Ansa89 ha scritto:Comunque se il confronto fallisce vuol dire che almeno una cifra del numero da confrontare non è zero.
infatti, ma la cosa strana è che lo è una cifra fuori dal campo float perchè stampavo il confronto e risultava alternato (per via dei calcoli) 0.000000 e -0.000000

ps: sto scrivendo un programmino per progetto e verifica di lunghe condotte (idraulica), la funzione per le tubazioni in serie l'ho appena finita :D

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: [C] lunghezza float [risolto]

Messaggio da Ansa89 »

La mia soluzione era troppo sporca, molto meglio la tua.
Per caso stai lavorando su macchina a 64 bit (ricorda che la dimensione delle variabili cambia anche a seconda dell'architettura)?

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 »

no no è a 32 bit... ma il tipo float dovrebbe creare variabili a 32 bit a prescindere no? come double a 64bit e int a 16bit...
o mi sbaglio?

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 »

sya54M ha scritto:no no è a 32 bit... ma il tipo float dovrebbe creare variabili a 32 bit a prescindere no? come double a 64bit e int a 16bit...
o mi sbaglio?
Puoi usare sizeof(); per vedere quanto vale un tipo nel tuo PC.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [C] lunghezza float [risolto]

Messaggio da Mario Vanoni »

sya54M ha scritto:ciao, ho notato che con numeri a molti decimali, facendo con confronto con 0 mi risultano delle condizioni di 0.000000 e -0.000000 e nessuno di questi soddisfa l'uguaglianza a 0, mi è sembrato strano, ma pare che anche se non visualizza il settimo decimale con float, in realtà ne tenga conto.
a me andrebbe anche meglio fermarmi al terzo decimale per dire che sia uguale a 0, ma come faccio? sembra che vada all'infinito...
grazie mille per eventuali aiuti
Scusa tanto, ma perche' non fai un cast su int,
vecchia regola UNIX e spiegato in K&R?

double a = 0.000000179;

if ((int) a == 0)
then
...

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 »

Mario Vanoni ha scritto:Scusa tanto, ma perche' non fai un cast su int,
perchè l'intero sarebbe sempre 0 e quindi mai verificata la condizione, mi servono 3 o 4 decimali.
si tratta del calcolo della portata in tubazioni a sezioni diverse collegate in serie, fatto con una procedura iterativa

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] lunghezza float [risolto]

Messaggio da targzeta »

Mario Vanoni ha scritto:...
Scusa tanto, ma perche' non fai un cast su int,
vecchia regola UNIX e spiegato in K&R?

double a = 0.000000179;

if ((int) a == 0)
then
...
Perchè a lui interessa una precisione di 3 o 4 cifre da quello che ho capito. Con la tua vecchia regola anche (int) 0.2 è uguale a 0 e non si ha la pracisione voluta. Personalmente mi piace di più la soluzione di Ansa89 (leggila è vedrai che diceva la stessa cosa che vuoi dire tu, solo che con la sua si può scegliere la precisione).

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

zxzxasas
Linux 2.x
Linux 2.x
Messaggi: 397
Iscritto il: sab 15 nov 2008, 2:28
Nome Cognome: Pasquale
Slackware: current
Kernel: 2.6.35.7
Desktop: KDE 4.5.2

Re: [C] lunghezza float [risolto]

Messaggio da zxzxasas »

float e duoble entrambe 8byte, ma float in virgola mobile (ieee 754) mentre double a virgola fissa!

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 »

zxzxasas ha scritto:float e duoble entrambe 8byte, ma float in virgola mobile (ieee 754) mentre double a virgola fissa!
come dici tu float dovrebbe essere a 64bit (8bytex8) come double, ma:
http://programmazione.html.it/guide/lez ... bili-in-c/
è chiaramente scritto che solo double è a 64bit

zxzxasas
Linux 2.x
Linux 2.x
Messaggi: 397
Iscritto il: sab 15 nov 2008, 2:28
Nome Cognome: Pasquale
Slackware: current
Kernel: 2.6.35.7
Desktop: KDE 4.5.2

Re: [C] lunghezza float [risolto]

Messaggio da zxzxasas »

Beh in effetti:
pasquale@DarkStar:~$ cat index.c
#include <stdio.h>
main(){
int lunghezza;
lunghezza=sizeof(double);
printf("\nLa lunghezza di un double è %d byte",lunghezza);
lunghezza=sizeof(float);
printf("\nLa lunghezza di un float è %d byte",lunghezza);
}

pasquale@DarkStar:~$ gcc index.c -o index

pasquale@DarkStar:~$ ./index
La lunghezza di un double è 8 byte
La lunghezza di un float è 4 byte
Sistema a 32 bit...

Ed effettivamente, lo standard (754) prevede sia 32 che 64 che 128 bit...

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: [C] lunghezza float [risolto]

Messaggio da Ansa89 »

Mario Vanoni ha scritto:Scusa tanto, ma perche' non fai un cast su int,
vecchia regola UNIX e spiegato in K&R?

double a = 0.000000179;

if ((int) a == 0)
then
...
Come anche la mia soluzione ha un piccolo problema: se il numero da convertire a int è 10^30, c'è un leggero problema di overflow; mentre con la soluzione di sya54M non ci sono problemi di questo tipo :) .

Rispondi