Pagina 1 di 2

[C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 18:49
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

Re: [C] lunghezza float

Inviato: mer 14 apr 2010, 18:55
da targzeta
Non ci ho capito molto, potresti fare un esempio? Al limite posta un po' di codice.

Emanuele

Re: [C] lunghezza float

Inviato: mer 14 apr 2010, 19:11
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.

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 19:24
da Ansa89
Alla fine come hai risolto?

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 19:27
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

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 19:38
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)?

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 20:03
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?

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 20:28
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.

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 20:56
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
...

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 21:07
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

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 21:08
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

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 22:23
da zxzxasas
float e duoble entrambe 8byte, ma float in virgola mobile (ieee 754) mentre double a virgola fissa!

Re: [C] lunghezza float [risolto]

Inviato: mer 14 apr 2010, 22:33
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

Re: [C] lunghezza float [risolto]

Inviato: gio 15 apr 2010, 1:00
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...

Re: [C] lunghezza float [risolto]

Inviato: gio 15 apr 2010, 8:38
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 :) .