Pages: [1]   Go Down
Print
Author Topic: Somma con numeri decimali in Matlab  (Read 2974 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
spring
Matricola
*
Offline Offline

Posts: 30



« on: 09-04-2010, 17:08:07 »

Eseguendo il seguente calcolo in Matlab 
0.6+0.6-0.4-0.4-0.4
restituisce -1.1102e-016
mentre dovrebbe restituire 0, come è possibile risolvere ciò?
Grazie
Logged
andreacannella
Administrator
Forumista Esperto
*****
Offline Offline

Gender: Male
Posts: 1.488


Andea Cannella - www.andreacannella.com


WWW
« Reply #1 on: 10-04-2010, 16:09:25 »

Code:
uint8(0.6+0.6-0.4-0.4-0.4)
Logged

Le tre grandi virtù di un programmatore: pigrizia, impazienza e arroganza. (Larry Wall)

Good times for a change
See, the luck I've had
Can make a good man
Turn bad

So please, please, please
Let me, let me, let me
Let me get what I want
This time

The Smiths
spring
Matricola
*
Offline Offline

Posts: 30



« Reply #2 on: 10-04-2010, 18:34:46 »

Ma se fai uint8(0.5+0.6-0.4-0.4-0.4)
restituisce 0 e non -0.1. Mi sa che è un problema di casting dei numeri decimali
Logged
andreacannella
Administrator
Forumista Esperto
*****
Offline Offline

Gender: Male
Posts: 1.488


Andea Cannella - www.andreacannella.com


WWW
« Reply #3 on: 11-04-2010, 19:05:34 »

Ma se fai uint8(0.5+0.6-0.4-0.4-0.4)
restituisce 0 e non -0.1. Mi sa che è un problema di casting dei numeri decimali

Il problema è la precisione dei Double...

Mettendo:
Code:
>> format bank
>> sum([0.60, 0.60, -0.40, -0.40, -0.40])
ans =
         -0.00
>> sum([0.50, 0.60, -0.40, -0.40, -0.40])
ans =
         -0.10

In un certo senso funziona perché limita le cifre decimali a 2  ok
Logged

Le tre grandi virtù di un programmatore: pigrizia, impazienza e arroganza. (Larry Wall)

Good times for a change
See, the luck I've had
Can make a good man
Turn bad

So please, please, please
Let me, let me, let me
Let me get what I want
This time

The Smiths
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #4 on: 11-04-2010, 21:54:24 »

Eseguendo il seguente calcolo in Matlab 
0.6+0.6-0.4-0.4-0.4
restituisce -1.1102e-016
mentre dovrebbe restituire 0, come è possibile risolvere ciò?
Grazie
A Formazione Numerica un tempo avevamo parlato di come venivano rappresentati i numeri a virgola mobile in un calcolatore.

Sapendo che la precisione infinita non si può ottenere, il problema da risolvere adesso qual è?

Sarò più esplicito:
  • devi confrontare un certo risultato con zero?
  • devi confrontare un certo risultato con un altro numero costante noto?
  • devi vedere una rappresentazione quanto più verosimile (ad es. in questo caso "0") di un calcolo di questo tipo, ad esempio in una stampa a video?
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Aigor
Forumista Esperto
****
Offline Offline

Gender: Male
Posts: 1.184


"Il destino non è una catena, ma un volo."[A.B.]


« Reply #5 on: 11-04-2010, 23:43:19 »

Ma se fai uint8(0.5+0.6-0.4-0.4-0.4)
restituisce 0 e non -0.1. Mi sa che è un problema di casting dei numeri decimali

Usa il comando chop passandogli l'operazione e il numero di cifre di precisione che vuoi conservare.
Logged

"Era d'altronde uno di quegli uomini che amano assistere alla propria vita, ritenendo impropria qualsiasi ambizione a viverla.
Si sarà notato che essi osservano il loro destino nel modo in cui, i più, sono soliti osservare una giornata di pioggia." - Seta,Baricco
spring
Matricola
*
Offline Offline

Posts: 30



« Reply #6 on: 12-04-2010, 10:10:11 »

Ma se fai uint8(0.5+0.6-0.4-0.4-0.4)
restituisce 0 e non -0.1. Mi sa che è un problema di casting dei numeri decimali

Usa il comando chop passandogli l'operazione e il numero di cifre di precisione che vuoi conservare.


Forse non conviene utilizzare chop.
Se si fa x=(0.6+0.6-0.4-0.4-0.4) e poi chop(x,1) restuisce

ans =

 -1.0000e-016.

Mi sa che conviene utilizzare format bank. ok
Grazie!!
Logged
Pages: [1]   Go Up
Print
Jump to: