Go Down

Topic: Maledette funzioni!! (Read 15053 times) previous topic - next topic

lestofante



E' vero che ogni volta che crei una funzione che accetta dei parametri devi mettere questi dati nello stack, ma se usi una var globale e poi se devi parcheggiare la variabile globale in altre variabili, alla fine occupi lo stesso della memoria per le variabili tampone.
E comunque non è elegante  ;)

Grazie, sono metallaro  ;)
Diciamo che al punto dove sono ora, non essendo un programmatore, mi accontento di non essere elegante, l'importante e' che mentalmente mi risulta piu' facile ragionare sui codici che scrivo usando solo var globali. Logicamente resta cmq importante saper leggere una funzione con argomenti e return di valori, altrimenti non si capisce il codice che si vuole copiare scrivere  :)



l'uso di funzioni è migliore per evitare di ricopiare il codice in più punti e per dividere il codice in blocchi indipendenti.
il salto di funzione impiega tempo per scrivere i dati nello stack, oltre che lo stato attuale dei registri, e poi ricaricare il tutto al momento del ritorno. Però è anche vero che il compilatore può decidere di rendere delle funzioni "inline", ovvero al momento della pre-compilazione decidere che l'uso di una funzione è inefficiente e copiare il codice contenuto nella funzione al posto della chiamata: puoi anche specificare al compilatore di comportarsi così (o meglio suggerirlo, visto che può ignorare la cosa) con la keyword "inline".

Quote
Qui mi chiedo come sia possibile, il mio è abbastanza preciso ma tempo addietro feci delle prove nel calcolare la distanza ed in effetti l'errore era decisamente alto

infatti, sarebbe da fpreparare un bell'elenco di coordinate GPS con risultati attesi calcolati con una buona precisione, e magari scelte con un criterio tra le più balorde, così d'ora in poi abbiamo tutti un buon punto di riferimento per -dimostrare- che il codice funziona.

Si usa dire "pics or it didn't happen", per il nostro caso lo cambierei in "TEST or it didn't happen"  XD
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

paolometeo2

#46
Aug 23, 2013, 01:11 pm Last Edit: Aug 23, 2013, 01:13 pm by paolometeo2 Reason: 1
Quote
Arduino non ha i double quindi i calcoli col GPS non si possono fare con risoluzione metrica, solo kilometrica, cosa ampiamente discussa nel topic dei quadricotteri.
Basta farsi un paio di calcoli di prova per capirlo, il gps fornisce valori fino a tre cifre intere e sei cifre decimali, i modelli migliori (=$$$) anche sette-otto, i float 32 bit al massimo rappresentano sette cifre tra parte intera e decimale.
In Italia la latidudine media è ~40°, la longitudine media è ~12° (andando molto a Nord scende sotto il valore di 10), ovvero valori con due cifre per la parte intera il che vuol dire perdere l'ultima cifra decimale fornita dal gps, poi mettiamoci gli errori di arrotondamento, molto pesanti per via della complessità del calcolo, ed ecco che la risoluzione minima reale diventa da molte decine di metri a diverse centinaia, la precisione reale è kilometrica.

@astro, non capisco perché insisti sul discorso precisione. Ho fatto parecchi confronti tra distanze calcolate da Arduino, tra due punti di coordinate date dal GPS, e le stesse calcolate con un programma Fortran in doppia precisione (real*otto), oltre a calcolarle con una HP di buona memoria. Se le coordinate si riferiscono ad aree italiane con distanze dell'ordine di qualche chilometro, i calcoli danno precisioni di qualche metro. Ho fatto prove anche sul campo.
@PaoloP, se interessa posto cambiare titolo al topic, mi rimetto però al parere del moderatore. Convengo anch'io che qui si sono mischiati due topic. Uno di tipo software sulle funzioni e l'altro sul GPS.
Scusate tutti se rispondo tardi, ma sono in vacanza e non trovo spesso connessioni veloci. Comunque le discussioni innescate mi interessano.
paolo
paolo
www.meteoenergia.it

astrobeed


[@astro, non capisco perché insisti sul discorso precisione. Ho fatto parecchi confronti tra distanze calcolate da Arduino, tra due punti di coordinate date dal GPS, e le stesse calcolate con un programma Fortran in doppia precisione (real*otto),


Perché quanto affermi è impossibile, nel topic su i quadricotteri la cosa era stata sviscerata nei minimi dettagli, con tanto di calcoli e software di esempio per Arduino.
La matematica è una scienza esatta, non puoi calcolare con precisione metrica la distanza tra due coordinate gps con solo sei cinque, se non solo quattro (dipende dalla parte intera) cifre decimali significative, per giunta con dei calcoli trigonometrici di mezzo, servono almeno 10 cifre significative dopo la virgola, cosa per la quale sono indispensabili i double.
Scientia potentia est

paolometeo2

#48
Aug 23, 2013, 05:03 pm Last Edit: Aug 23, 2013, 05:06 pm by paolometeo2 Reason: 1
Quote
Perché quanto affermi è impossibile, nel topic su i quadricotteri la cosa era stata sviscerata nei minimi dettagli, con tanto di calcoli e software di esempio per Arduino.
La matematica è una scienza esatta, non puoi calcolare con precisione metrica la distanza tra due coordinate gps con solo sei cinque, se non solo quattro (dipende dalla parte intera) cifre decimali significative, per giunta con dei calcoli trigonometrici di mezzo, servono almeno 10 cifre significative dopo la virgola, cosa per la quale sono indispensabili i double.


Il mio ragionamento è semplice. Un grado in latitudine corrisponde a circa 110 km, questo vuol dire che 1 m è circa 1/100000 gradi. Cioè siamo sulla quinta cifra decimale della latitudine. Per la longitudine, alle nostre latitudini, la distanza è circa 70 km, quindi siamo lì. La distanza è calcolata come se lat e long fossero coordinate cartesiane su piano e questo è vero per distanze dell'ordine di pochi chilometri. La conversione tra differenze in gradi e metri è fatta moltiplicando per un fattore pari a R*pi/180 dove R è il raggio terrestre medio e pi = pi greco. L'unico calcolo trigonometrico è il coseno della latitudine quando si calcola la distanza tra due longitudini.
Ho fatto una prova su una distanza dell'ordine di un centinaio di metri, misurando con una bindella, e le cose tornano a meno di qualche metro.
paolo
www.meteoenergia.it

astrobeed


Il mio ragionamento è semplice. Un grado in latitudine corrisponde a circa 110 km, questo vuol dire che 1 m è circa 1/100000 gradi.


Se ti "inventi" dei calcoli che sono validi solo in un ristretto range di lat. e long, per giunta approssimati su un piano, è un altro paio di maniche, però un sistema che calcola il vettore tra due coordinate gps non può essere limitato a solo una certa zona e per spazi di pochi km, magari risolve il tuo problema però non va bene per un uso generico.
Io ho perso molto tempo per trovare una semplificazione per questo calcolo, rispetto a quello canonico che tiene conto del modello geodetico, con una approssimazione valida per tutto il globo, salvo le zone polari, con buoni risultati a patto di introdurre un fattore correttivo per ogni 250 metri di dislivello s.l.m., però puoi scordarti di fare questi conti con solo i float.
Scientia potentia est

paolometeo2

Concordo con te che una formula generale per tutto il globo non funzionerebbe a 32 bit, però ti assicuro che le approssimazioni che faccio, possono essere estese ad un'area abbastanza ampia, sicuramente tutta l'Italia e oltre. A meno che un quadricottero non faccia la traversata dell'Atlantico  :D, si può sempre trovare una buona approssimazione. Tieni anche conto che un normale GPS non consente precisioni maggiori di qualche metro.
paolo
www.meteoenergia.it

testato

quindi si insiste sulla questione, e questo e' bello. :)

ricapitolando paolo tu stai dicendo che con arduino uno, 328P, potresti impostare le coordinate di arrivo di un modellino in partenza da roma (ti vengo in contro  :)) verso il duomo di milano, e che questo, avendo tutto cio' di cui occorre (benzina, batterie, fortuna, aiuto del signore) e leggendo in realtime le coordinate di un gps a bordo,  riuscirebbe ad atterrare nella piazza del duomo ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

lestofante

ed ecco perchè bisogna generare un elenco di coordinate su cui fare i test ;)
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

leo72

Il problema dei float dell'Arduino è che sono limitati a 6/7 cifre in totale, non a 6/7 cifre decimali.
Questo significa che un numero come Longitudine 1.123456 riesci a gestirlo ma se hai Longitudine 171.123457 non ce la fai perché esaurisci la capacità del float e ti ritroverai magari 171.123 oppure 171.1234 (va visto cosa fa il compilatore). E addio precisione.

testato

yes, quello che ha detto in altre parole anche astro.
ed in piu' il Double, pur esistendo come funzione, non cambia nulla, e' una fotocopia del float da quel che ho capito.
Infatti mi chiedevo perche' l'hanno inserita nel reference se fa le stesse cose di float ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

lestofante


esistendo come funzione

*tipo di dato


Infatti mi chiedevo perche' l'hanno inserita nel reference se fa le stesse cose di float ?

compatibilità con codice pre-esistente. per esempio se fai copia incolla di un pezzo di codice "standard" etc.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

leo72


ed in piu' il Double, pur esistendo come funzione, non cambia nulla, e' una fotocopia del float da quel che ho capito.
Infatti mi chiedevo perche' l'hanno inserita nel reference se fa le stesse cose di float ?

E' per via dell'implementazione del C/C++ fatta per l'architettura Avr del compilatore avr-gcc.
Siccome l'architettura Avr è limitata non era possibile integrare l'uso dei double senza sprecare un sacco di risorse. Per evitare questo e per evitare, come dice lesto, problemi di compatibilità del codice "standard" hanno strutturato i double come alias dei float normali.

paolometeo2

Quote
Il problema dei float dell'Arduino è che sono limitati a 6/7 cifre in totale, non a 6/7 cifre decimali.
Questo significa che un numero come Longitudine 1.123456 riesci a gestirlo ma se hai Longitudine 171.123457 non ce la fai perché esaurisci la capacità del float e ti ritroverai magari 171.123 oppure 171.1234 (va visto cosa fa il compilatore). E addio precisione.

@leo, le prove che ho fatto riguardano coordinate delle nostre parti, cioè con al massimo 2 cifre per i gradi interi e 5 decimali.
paolo
www.meteoenergia.it

leo72


paolometeo2

Quote
ricapitolando paolo tu stai dicendo che con arduino uno, 328P, potresti impostare le coordinate di arrivo di un modellino in partenza da roma (ti vengo in contro  smiley) verso il duomo di milano, e che questo, avendo tutto cio' di cui occorre (benzina, batterie, fortuna, aiuto del signore) e leggendo in realtime le coordinate di un gps a bordo,  riuscirebbe ad atterrare nella piazza del duomo ?

Quello che dici @testato, non è impossibile! L'importante è memorizzare un certo numero di punti lungo il tracciato e dirigere il modellino su ciascun punto in sequenza!
paolo
www.meteoenergia.it

Go Up