C: confronti con variabili "float".

Tutta l'informatica

C: confronti con variabili "float".

Messaggioda AmigaCori » sab ott 13, 2007 8:04 pm

Salve, eccomi ancora con dubbi sul C :scherza:

Una cosa del tipo for (riga=0;riga<=0.06;riga+=0.02)

ove riga e' di tipo float

e' "corretta"?, ho letto che e' sconsigliato fare confronti con i numeri in virgola mobile, pensavo quindi che come contatori si utilizzassero solo interi.

Capisco che in questo caso il valore 0.06 sono certo di raggiungerlo perche' incremento di 0.02 ad ogni ciclo...pero' mi resta il dubbio se sia una cosa da evitare o...se non c'e' nessun problema :felice:

Grazie :felice:
Admin. di NSA www.NonSoloAmiga.com
Twitter: https://twitter.com/NonSoloAmiga
Facebook: http://www.facebook.com/NonSoloAmiga
Gruppo FB: http://www.facebook.com/groups/NonSoloAmiga/
Youube: http://www.youtube.com/user/NonSoloAmiga
AmigaCori

Supremo
 
Messaggi: 4527
Iscritto il: gio feb 26, 2004 4:48 pm

Re: C: confronti con variabili "float".

Messaggioda riko » ven ott 19, 2007 2:00 am

Il discorso è lungo. Si sconsigliano confronti di uguaglianza, poichè tali confronti non hanno senso.

Infatti l'uguaglianza è uguaglianza *assoluta* bit a bit. Per cui due operazioni sulla carta con risultati 'uguali' potrebbero in macchina dare luogo a risultati *diversi* in macchina.

In pratica il confronto tramite == non è significativo. E' invece standard controllare che sei minore/minore o uguale (e viceversa) di una certa quantità. Questo non ha senso *sempre* ma in determinati casi ha senso.

Se per esempio non vuoi superare x, puoi usare y < x. Male che butta Ti fermerai 'appena prima'.

In generale i confronti comunque si fanno usando un 'epsilon' che può essere anche l'epsilon di macchina che ti da risposte 'circa' uguali etc.

Comunque se devi fare calcolo scientifico, ti consiglio testi dedicati. Non è roba che si improvvisa. Aggiungerei che se devi anche arrivarci in fondo 'in breve' mi terrei lontano da C, a meno che tu non lo conosca già bene.
-enrico
fibs = 0 : 1: [ a + b | (a, b) <- zip fibs (tail fibs) ]


Akropolix: Community OFF-TOPIC di IKSnet
http://www.akropolix.net/forum

"se do da mangiare a un affamato mi dicono che sono un santo, se mi chiedo perch? ? affamato mi dicono che sono un comunista" (Helder C?mara, Arcivescovo di Recife)
Avatar utente
riko

Supremo
 
Messaggi: 3329
Iscritto il: gio mar 04, 2004 4:28 pm
Località: Chiba City

Messaggioda AmigaCori » mar ott 23, 2007 3:51 pm

Grazie della spiegazione :felice:, proprio di fretta non vado, pero' dovrei usare un po' di calcolo scientifico quindi faro' sicuramente approfondimenti.

Allora, sapevo che il confronto di uguaglianza tra numeri con la virgola ha poco senso perche' tale numero e' solo una rappresentazione di cio' che e' in realta' il numero con tutti i suoi decimali.

L'esempio che ho postato doveva dare come risultato, secondo l'autore, una tabella dove 0.00 non doveva essere stampato, in realta' facendo girare il suo programma il 0.00 veniva stampato...mi sono riscritto il semplice programma e tutto ha funzionato.

Dov'e' il problema?, e' che a rigor di logica il programma esempio doveva NON stampare 0.00, mi e' allora venuto il dubbio che l'inghippo fosse nell'uso non appropriato del confronto tra float.

Sul libro che sto usando per apprendere, il Deitel&Deitel (sono a livello -1 :scherza: ), mi sembrava d'aver letto che si sconsigliasse il confronto tra float...e forse ora capisco il perche' :triste:

Domanda:
Io avrei bisogno di imparare a gestire l'I/0 sull porta seriale, ho letto che su piattaforme Linux si usa la funzione ioctl() pero'....sul web ho trovato poco o nulla, magari puoi consigliarmi qualche libro o link....io in sostanza dovrei fare lettura/scrittura di dati sulla porta seriale: comandare dispositivi ed acquisire dati, immagazzinarli in un file ed operarci con altri linguaggi (Rebol nel mio caso).

Non e' per lavoro, solo a scopo "ludico" e personale, mi ha sempre affascinato l'interfacciamento tra computer e periferiche ma non ho mai avuto le competenze :scherza: ...ora vorrei iniziare ad averle.

Hai mai letto "come fare un caffe' sotto Linux"?: ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/Coffee
mitico!!! :ride: solo che il tizio non usa il C :triste:
Admin. di NSA www.NonSoloAmiga.com
Twitter: https://twitter.com/NonSoloAmiga
Facebook: http://www.facebook.com/NonSoloAmiga
Gruppo FB: http://www.facebook.com/groups/NonSoloAmiga/
Youube: http://www.youtube.com/user/NonSoloAmiga
AmigaCori

Supremo
 
Messaggi: 4527
Iscritto il: gio feb 26, 2004 4:48 pm

Messaggioda riko » mer ott 24, 2007 8:10 pm

Allora, sapevo che il confronto di uguaglianza tra numeri con la virgola ha poco senso perche' tale numero e' solo una rappresentazione di cio' che e' in realta' il numero con tutti i suoi decimali.


Non è solo questione di 'rappresentazione'. E' proprio questione di *errore*. I float *non* hanno operazioni esatte.

Alcuni linguaggi di programmazione (Python, Cobol) offrono *anche* numeri decimali che (con una velocità minore) permettono una precisione *totale*. Fermo restando che per motivi squisitamente teorici è impossibile rappresentare i reali su un computer, rimane possibile rapprensentare i razionali.

No, non ti consiglio di usarli per fare calcolo. Servono per applicazioni finanziarie dove si può perdere velocità ma non precisione.

L'esempio che ho postato doveva dare come risultato, secondo l'autore, una tabella dove 0.00 non doveva essere stampato, in realta' facendo girare il suo programma il 0.00 veniva stampato...mi sono riscritto il semplice programma e tutto ha funzionato.


Quello che stampi passa per delle routine che cercano di 'abbellire' l'output.

Sul libro che sto usando per apprendere, il Deitel&Deitel (sono a livello -1 :scherza: ), mi sembrava d'aver letto che si sconsigliasse il confronto tra float...e forse ora capisco il perche' :triste:

Wow, qualcuna l'imbrocca.

Domanda:
Io avrei bisogno di imparare a gestire l'I/0 sull porta seriale, ho letto che su piattaforme Linux si usa la funzione ioctl() pero'....sul web ho trovato poco o nulla, magari puoi consigliarmi qualche libro o link....io in sostanza dovrei fare lettura/scrittura di dati sulla porta seriale: comandare dispositivi ed acquisire dati, immagazzinarli in un file ed operarci con altri linguaggi (Rebol nel mio caso).

Non e' per lavoro, solo a scopo "ludico" e personale, mi ha sempre affascinato l'interfacciamento tra computer e periferiche ma non ho mai avuto le competenze :scherza: ...ora vorrei iniziare ad averle.

Hai mai letto "come fare un caffe' sotto Linux"?: ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/Coffee
mitico!!! :ride: solo che il tizio non usa il C :triste:


1. io non userei C per farlo, ma direttamente Rebol.
2. io lo ho visto fare in Python, con pyserial
3. http://en.wikibooks.org/wiki/Serial_Pro ... rial_Linux
4. posso consigliarti il celebre Advanced Programming in the Unix Environment di Stevens (per quanto riguarda ioctl e termios).
-enrico
fibs = 0 : 1: [ a + b | (a, b) <- zip fibs (tail fibs) ]


Akropolix: Community OFF-TOPIC di IKSnet
http://www.akropolix.net/forum

"se do da mangiare a un affamato mi dicono che sono un santo, se mi chiedo perch? ? affamato mi dicono che sono un comunista" (Helder C?mara, Arcivescovo di Recife)
Avatar utente
riko

Supremo
 
Messaggi: 3329
Iscritto il: gio mar 04, 2004 4:28 pm
Località: Chiba City

Messaggioda MazinKaesar » mer ott 24, 2007 8:20 pm

In genere, con double/float, usiamo una tecnica forse poco elegante, ma funzionale. Supponiamo di dover confrontare due double, entrambi per esempio con due cifre decimali (es: importo finale in euro). Ne si fa la differenza, la si arrotonda alla seconda cifra decimale e ne prendi il in valore assoluto, e la si confrantolo con 0.01.

E' orribile, ma funziona, da circa 15 anni ... :ammicca:

Purtroppo il C non dovrebbe essere usato per fare gestionali... :no:
Immagine Immagine
Immagine Immagine
Immagine Immagine
Avatar utente
MazinKaesar

Supporter!!
 
Messaggi: 4053
Iscritto il: sab set 18, 2004 8:43 pm
Località: Modena

Messaggioda riko » gio ott 25, 2007 9:40 am

MazinKaesar ha scritto:In genere, con double/float, usiamo una tecnica forse poco elegante, ma funzionale. Supponiamo di dover confrontare due double, entrambi per esempio con due cifre decimali (es: importo finale in euro). Ne si fa la differenza, la si arrotonda alla seconda cifra decimale e ne prendi il in valore assoluto, e la si confrantolo con 0.01.

E' orribile, ma funziona, da circa 15 anni ... :ammicca:


Spero che con 'confronto' intendi dire |x1-x2| < 0.01.
In questo caso non solo non è brutto, ma è precisamente il metodo corretto.

Si basa appunto sul fatto che non puoi vedere se due numeri sono 'uguali', ma puoi invece vedere che sono 'abbastanza' vicini. O per dirlo con la matematica, che il secondo è contenuto in un intorno centrato sul primo e con un raggio di meno di 0.01


Purtroppo il C non dovrebbe essere usato per fare gestionali... :no:


Su questo pure sono d'accordo. Anche se oggetti come GMP potrebbero rendere la cosa piuttosto più agevole.
-enrico
fibs = 0 : 1: [ a + b | (a, b) <- zip fibs (tail fibs) ]


Akropolix: Community OFF-TOPIC di IKSnet
http://www.akropolix.net/forum

"se do da mangiare a un affamato mi dicono che sono un santo, se mi chiedo perch? ? affamato mi dicono che sono un comunista" (Helder C?mara, Arcivescovo di Recife)
Avatar utente
riko

Supremo
 
Messaggi: 3329
Iscritto il: gio mar 04, 2004 4:28 pm
Località: Chiba City

Messaggioda MazinKaesar » gio ott 25, 2007 10:05 am

riko ha scritto:Spero che con 'confronto' intendi dire |x1-x2| < 0.01.
In questo caso non solo non è brutto, ma è precisamente il metodo corretto.


Esatto... pensavo che mi (ci) avresti picchiato. Ma in effetti con i double è un casino :scherza: Soprattuto quando hai a che fare per esempio con i costi fornitore (i cosidetti canvass... non ho mai capito perchè li si chiama così!), che usano fino a 6 decimali.

Purtroppo il C non dovrebbe essere usato per fare gestionali... :no:


Su questo pure sono d'accordo. Anche se oggetti come GMP potrebbero rendere la cosa piuttosto più agevole.


Grazie della dritta, daremo un'occhiata :felice:
Immagine Immagine
Immagine Immagine
Immagine Immagine
Avatar utente
MazinKaesar

Supporter!!
 
Messaggi: 4053
Iscritto il: sab set 18, 2004 8:43 pm
Località: Modena

Messaggioda AmigaCori » gio ott 25, 2007 2:23 pm

Allora ragazzi, grazie a tutti! :felice:

Mi avete tolto qualche dubbio, fatto venire qualche dubbio: 'abbellire' l'output mi fa venire in mente di vedere un po' meglio come funziona lo stdio.h :scherza:.

@riko

Riguardo a Rebol, non sono riuscito a trovare riferimenti nella documentazione in merito alla gestione dell'I/O.

Rebol e' piu' un linguaggio di alto livello, il C invece ho letto che permette di operare sia in alto livello che a basso livello.

Comunque Rebol evolve velocemente, controllero' meglio :felice:

Grazie per il link ed il libro.
Admin. di NSA www.NonSoloAmiga.com
Twitter: https://twitter.com/NonSoloAmiga
Facebook: http://www.facebook.com/NonSoloAmiga
Gruppo FB: http://www.facebook.com/groups/NonSoloAmiga/
Youube: http://www.youtube.com/user/NonSoloAmiga
AmigaCori

Supremo
 
Messaggi: 4527
Iscritto il: gio feb 26, 2004 4:48 pm

Messaggioda MazinKaesar » gio ott 25, 2007 3:18 pm

AmigaCori ha scritto:Rebol e' piu' un linguaggio di alto livello, il C invece ho letto che permette di operare sia in alto livello che a basso livello.


Un tizio diceva che il C ha la potenzialità dell'assembly ... con la sintassi dell'assembly :ahah:
Immagine Immagine
Immagine Immagine
Immagine Immagine
Avatar utente
MazinKaesar

Supporter!!
 
Messaggi: 4053
Iscritto il: sab set 18, 2004 8:43 pm
Località: Modena

Messaggioda AmigaCori » gio ott 25, 2007 6:51 pm

MazinKaesar ha scritto:
AmigaCori ha scritto:Rebol e' piu' un linguaggio di alto livello, il C invece ho letto che permette di operare sia in alto livello che a basso livello.


Un tizio diceva che il C ha la potenzialità dell'assembly ... con la sintassi dell'assembly :ahah:


Significa che il C e' un casino da usare come lo e' l'assembler? :scherza:
Admin. di NSA www.NonSoloAmiga.com
Twitter: https://twitter.com/NonSoloAmiga
Facebook: http://www.facebook.com/NonSoloAmiga
Gruppo FB: http://www.facebook.com/groups/NonSoloAmiga/
Youube: http://www.youtube.com/user/NonSoloAmiga
AmigaCori

Supremo
 
Messaggi: 4527
Iscritto il: gio feb 26, 2004 4:48 pm

Messaggioda riko » sab ott 27, 2007 7:36 pm

MazinKaesar ha scritto:Esatto... pensavo che mi (ci) avresti picchiato.


Ripeto, è il modo corretto.

> Mi avete tolto qualche dubbio, fatto venire qualche dubbio: 'abbellire'
> l'output mi fa venire in mente di vedere un po' meglio come funziona lo
> stdio.h .

Non lo vuoi davvero, te lo dico io.

> Riguardo a Rebol, non sono riuscito a trovare riferimenti nella
> documentazione in merito alla gestione dell'I/O.

IMHO non hai cercato bene. In tutti i linguaggi di alto livello ci sono ste cose.

> Rebol e' piu' un linguaggio di alto livello, il C invece ho letto che
> permette di operare sia in alto livello che a basso livello.

Allora.. se non conosci C, non ti buttare a fare robe in C prima di conoscerlo bene. Finisce che ti appendi per i piedi da solo senza neppure sapere perchè.

Riguardo all'operare ad alto livello posso essere d'accordo se intendi che in C scrivi l'interprete per un linguaggio di alto livello e poi usi quello. <g>
C fa il suo mestiere, ma sarebbe bene che facesse solo quello.

Già su C++ sono più d'accordo sulla dicotomia alto/basso livello. Peccato Che c++ sia circa 4 volte più difficile di C (perchè per capire C++ bisogna capire C, capire bene la parte 'object oriented' di C++, la programmazione templatica ed eventualmente la metaprogrammazione templatica).
-enrico
fibs = 0 : 1: [ a + b | (a, b) <- zip fibs (tail fibs) ]


Akropolix: Community OFF-TOPIC di IKSnet
http://www.akropolix.net/forum

"se do da mangiare a un affamato mi dicono che sono un santo, se mi chiedo perch? ? affamato mi dicono che sono un comunista" (Helder C?mara, Arcivescovo di Recife)
Avatar utente
riko

Supremo
 
Messaggi: 3329
Iscritto il: gio mar 04, 2004 4:28 pm
Località: Chiba City


Torna a Tecnologia, internet, coding

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite