Operazioni con numeri ordine 10e-9

Ciao a tutti,

avrei bisogno di una conferma.

Vorrei operare con numeri dell´ordine di 10e-9 . E´ possibile farlo in Arduino? Cioé devo fare operazioni tra numeri molto piccoli, fino a che precisione posso spingermi con Arduino UNO?

Grazie.

Con l'Arduino hai max 6/7 cifre per i numeri di tipo "float". Il "double" non è implementato ed è un semplice alias di "float". C'è una libreria scritta da Nick Gammon, un utente del forum, per fare calcoli con numeri molto grandi. http://www.gammon.com.au/forum/?id=11519

Se guardi il "Reference" http://arduino.cc/en/Reference/Float scoprirai che :

Datatype for floating-point numbers, a number that has a decimal point. Floating-point numbers are often used to approximate analog and continuous values because they have greater resolution than integers. Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38. They are stored as 32 bits (4 bytes) of information.

Floats have only 6-7 decimal digits of precision. That means [u]the total number of digits[/u], not the number to the right of the decimal point.

Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.

Floating point numbers are not exact, and may yield strange results when compared. For example 6.0 / 3.0 may not equal 2.0. You should instead check that the absolute value of the difference between the numbers is less than some small number.

Floating point math is also much slower than integer math in performing calculations, so should be avoided if, for example, a loop has to run at top speed for a critical timing function. Programmers often go to some lengths to convert floating point calculations to integer math to increase speed.

Guglielmo

f.schiano: Cioé devo fare operazioni tra numeri molto piccoli, fino a che precisione posso spingermi con Arduino UNO?

Il limite non è dato da Arduino ma dal compilatore che lavora con i float a 32bit, per la loro natura esponenziale consentono di avere solo 7 cifre significative divise tra parte intera e parte decimale, p.e. 1,234567 oppure 12,34567 o 0,1234567, il che esclude a priori la rappresentazione di valori 10e-9 con sufficiente attendibilità.

Grazie mille. Volevo una conferma e l´ho avuta !

Invece sul DUE , la precisione puó essere estesa con il data type DOUBLE che in quel caso é a 8 byte.

Questo cosa comporta?

Quante cifre significative posso utilizzare?

Grazie mille

f.schiano:
Invece sul DUE , la precisione puó essere estesa con il data type DOUBLE che in quel caso é a 8 byte.

Con i double le cifre significative sono 14-15 a seconda del valore, puoi tranquillamente usare i tuoi valori 10e-9.

Puoi moltiplicarli per 1 miliardo e fare i calcoli. Occhio che long gestisce solo fino a 2'147'483'647.

Dipende più che altro dal numero di cifre significative che ti servono. Come ti hanno spiegato, siamo a 6 cifre significative, anche 7. Puoi lavorare con questi numeri e dopo RAPPRESENTARLI aggiungendo un 10^-quellochevuoi se tutti i numeri sono dello stesso ordine di grandezza. Le difficoltà nascono se hai necessità di fare operazioni fra numeri che differiscono fra loro per diversi ordini di grandezza e tenti di eseguirle direttamente. Puoi agire scomponendo le operazioni, come si fa lavorando "a mano", quindi per fare: 1.234 x 10^-4 x 2.345 x 10^2 / 3.456 x 10^7 eseguirai due operazioni 1.234 x 2.345 / 3.456 -4+2-7 Insomma, per ogni numero conservi due valori, uno con le 6 o 7 cifre significative nella forma x.yyyyy e l'altro è un intero z che rappresenta la potenza del 10 e poi li rappresenti come x.yyyyy x 10^z le operazioni le fai in due blocchi, agendo adeguatamente