La domanda è molto "datata", ma la risposta potrebbe essere utile a qualcuno.
Il problema nasce dall'utilizzo di numeri "double" come indici all'interno di un loop e, soprattutto, come indici per accedere agli elementi di un vettore, come nell'istruzione
j(i*10)=2;
Anche se nell'istruzione il valore dell'indice "i" viene moltiplicato per 10, rimane sempre un numero di tipo "double".
Nello specifico l'errore consiste nel calcolo che genera la sequenza "i=0.1:0.1:360" e, successivamente nella moltiplicazione degli stessi per "10".
Nel caso
i=0.3
si vuole accedere accedere al terzo elemento del vettore "j" tramite l'istruzione
j(1*10)
aspettandosi che "i*10" (con i=0.3) faccia "3".
Purtroppo così non è.
Se si imposta il "format" come "format longeng" e si esegue la differenza tra il valore di "i" (0.3) moltiplicato per "10" ed il numero "3", invece di "0", si ottiene come risultato
444.089209850063e-018
questo perchè, in realtà il valore di i(3) non è esattamente "0.3".
In realtà, il problema si riscontra anche per altri valori di "i".
Per risolvere il problema bisogna definire i valori dell'indice del loop come interi, nel caso, all'interno del loop servissero i valori "0.1:0.1:360" si può definire un vettore, prima del loop, che li contenga.
La soluzione proposta è stata implementata nello script che segue.
%
% Loop originale
%
for i=0.1:0.1:360
j(i*10)=2; % 2 è un valore fittizio
end
%
% Definizione del vettore "i_idx": contiene i valori che, nel loop
% originale erano assunti dalla varaibile "i"; questo vettore può essere
% usato all'interno del loop modificato nel caso servisse
%
i_idx=0.1:0.1:360;
%
% Definizione modificata del loop
%
for i=1:3600
j(i)=2; % 2 è un valore fittizio
%
% Esempio di utilizzo dei valori del vettore "i_idx" definiti come
% indice del loop nell'implementazione originale
%
a=sin(i_idx*180/pi);
end
Di seguito, lo script che permette di visualizzare l'errore di arrotondamento.
format
i=0.1:0.1:360;
i(3)
i(3)*10
format longeng
i(3)
i(3)*10
i(3)*10-3
int_idx=1:3600;
i=0.1:0.1:360;
differenza=(i*10)-int_idx;
format
% indici di "i" per i quali si verifica l'errore
bad_idx=find(differenza ~= 0.0);
Hope this helps.