Repository 32bit  Forum
Repository 64bit  Wiki

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

[C] lunghezza float [risolto]

Messaggioda sya54M » mer apr 14, 2010 17:49

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 apr 14, 2010 18:19, modificato 1 volta in totale.
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] lunghezza float

Messaggioda targzeta » mer apr 14, 2010 17:55

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

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6176
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] lunghezza float

Messaggioda Ansa89 » mer apr 14, 2010 18:11

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: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: [C] lunghezza float [risolto]

Messaggioda Ansa89 » mer apr 14, 2010 18:24

Alla fine come hai risolto?
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: [C] lunghezza float [risolto]

Messaggioda sya54M » mer apr 14, 2010 18:27

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
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] lunghezza float [risolto]

Messaggioda Ansa89 » mer apr 14, 2010 18:38

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
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: [C] lunghezza float [risolto]

Messaggioda sya54M » mer apr 14, 2010 19:03

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?
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] lunghezza float [risolto]

Messaggioda metrofox » mer apr 14, 2010 19:28

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.
Avatar utente
metrofox
Linux 2.6
Linux 2.6
 
Messaggi: 758
Iscritto il: gio ago 07, 2008 11:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)

Re: [C] lunghezza float [risolto]

Messaggioda Mario Vanoni » mer apr 14, 2010 19:56

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
...
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [C] lunghezza float [risolto]

Messaggioda sya54M » mer apr 14, 2010 20:07

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
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] lunghezza float [risolto]

Messaggioda targzeta » mer apr 14, 2010 20:08

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6176
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] lunghezza float [risolto]

Messaggioda zxzxasas » mer apr 14, 2010 21:23

float e duoble entrambe 8byte, ma float in virgola mobile (ieee 754) mentre double a virgola fissa!
zxzxasas
Linux 2.4
Linux 2.4
 
Messaggi: 397
Iscritto il: sab nov 15, 2008 2:28
Nome Cognome: Pasquale
Slackware: current
Kernel: 2.6.35.7
Desktop: KDE 4.5.2

Re: [C] lunghezza float [risolto]

Messaggioda sya54M » mer apr 14, 2010 21:33

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
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] lunghezza float [risolto]

Messaggioda zxzxasas » gio apr 15, 2010 0:00

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...
zxzxasas
Linux 2.4
Linux 2.4
 
Messaggi: 397
Iscritto il: sab nov 15, 2008 2:28
Nome Cognome: Pasquale
Slackware: current
Kernel: 2.6.35.7
Desktop: KDE 4.5.2

Re: [C] lunghezza float [risolto]

Messaggioda Ansa89 » gio apr 15, 2010 7:38

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 :) .
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti