Sono alle prime armi con matlab, e risolvendo un esercizio di un libro devo spiegare perché non funziona il seguente codice:
x = 0; delta = 0.1;
while x ~= 1, x = x+delta, end
, come mai?? Sapete aiutarmi?
grazie
Sono alle prime armi con matlab, e risolvendo un esercizio di un libro devo spiegare perché non funziona il seguente codice:
x = 0; delta = 0.1;
while x ~= 1, x = x+delta, end
, come mai?? Sapete aiutarmi?
grazie
"Nessuno mi ha visto farlo, e non puoi provarlo in nessun modo!" (Bart Simpson)
>>> www.ombresulweb.com <<<
Up!! Nessuno che conosce matlab??![]()
"Nessuno mi ha visto farlo, e non puoi provarlo in nessun modo!" (Bart Simpson)
>>> www.ombresulweb.com <<<
in effetti non funziona...
l'unico motivo valido che ho trovato è che si tratti di un problema di rappresentazione interna dei float. In effetti non è mai una cosa saggia verificare l'uguaglianza diretta di due numeri in virgola mobile. Nel tuo caso probabilmente la somma dà una cosa del tipo 0.999999999999999999 che poi viene arrotondato ad 1 in fase di visualizzazione.... ma non è uguale ad 1!
Prova con
codice:x = 0; delta = 0.1; while x < 1, x = x+delta, end
In ogni caso, in tutte le situazione in cui tu debba eseguire un ciclo un numero noto di volte l'uso del for è forse più adeguato..
Leggi il REGOLAMENTO!
E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
Drugo
Ok, grazie... perché ho provato ora anche a vedere l'output del valori intermedi, e sembrerebbe che il valore sia effettivamente 1... boh
codice:octave:1> format long e octave:2> x=0 x = 0.00000000000000e+00 octave:3> delta=0.1 delta = 1.00000000000000e-01 octave:4> while x~=1, x=x+delta, end x = 1.00000000000000e-01 x = 2.00000000000000e-01 x = 2.00000000000000e-01 x = 3.00000000000000e-01 x = 4.00000000000000e-01 x = 5.00000000000000e-01 x = 6.00000000000000e-01 x = 7.00000000000000e-01 x = 8.00000000000000e-01 x = 9.00000000000000e-01 x = 1.00000000000000e+00 x = 1.10000000000000e+00 ...
"Nessuno mi ha visto farlo, e non puoi provarlo in nessun modo!" (Bart Simpson)
>>> www.ombresulweb.com <<<
però prova a fare:
codice:x=0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1; x==1;
Leggi il REGOLAMENTO!
E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
Drugo
Sono riuscito a vedere perché non funziona, usando il comando format bit, che mostra i bit realmente memorizzati in memoria, secondo lo standard IEEE 754:
l'ultima riga dovrebbe indicare il valore 1, però differisce dal valore 1 che ho fatto stampare all'iniziocodice:octave:1> format bit octave:2> 1 ans = 0011111111110000000000000000000000000000000000000000000000000000 octave:3> x=0 x = 0000000000000000000000000000000000000000000000000000000000000000 octave:4> delta=0.1 delta = 0011111110111001100110011001100110011001100110011001100110011010 octave:5> while x~=1, x=x+delta, end x = 0011111110111001100110011001100110011001100110011001100110011010 x = 0011111111001001100110011001100110011001100110011001100110011010 x = 0011111111010011001100110011001100110011001100110011001100110100 x = 0011111111011001100110011001100110011001100110011001100110011010 x = 0011111111100000000000000000000000000000000000000000000000000000 x = 0011111111100011001100110011001100110011001100110011001100110011 x = 0011111111100110011001100110011001100110011001100110011001100110 x = 0011111111101001100110011001100110011001100110011001100110011001 x = 0011111111101100110011001100110011001100110011001100110011001100 x = 0011111111101111111111111111111111111111111111111111111111111111... ora proverò ad interpretare il valore dei bit memorizzati...
p.s.: aggiungo anche
anche se i due valori "dovrebbero" essere tutti e due 1 :master:codice:octave:3> 1 ans = 0011111111110000000000000000000000000000000000000000000000000000 octave:4> 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 ans = 0011111111101111111111111111111111111111111111111111111111111111
"Nessuno mi ha visto farlo, e non puoi provarlo in nessun modo!" (Bart Simpson)
>>> www.ombresulweb.com <<<