Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di MatCap83
    Registrato dal
    Jun 2005
    residenza
    Firenze
    Messaggi
    1,319

    [MATLAB] Perché non funziona?!

    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 <<<

  2. #2
    Utente di HTML.it L'avatar di MatCap83
    Registrato dal
    Jun 2005
    residenza
    Firenze
    Messaggi
    1,319
    Up!! Nessuno che conosce matlab??
    "Nessuno mi ha visto farlo, e non puoi provarlo in nessun modo!" (Bart Simpson)

    >>> www.ombresulweb.com <<<

  3. #3
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    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

  4. #4
    Utente di HTML.it L'avatar di MatCap83
    Registrato dal
    Jun 2005
    residenza
    Firenze
    Messaggi
    1,319
    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 <<<

  5. #5
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    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

  6. #6
    Utente di HTML.it L'avatar di MatCap83
    Registrato dal
    Jun 2005
    residenza
    Firenze
    Messaggi
    1,319
    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:

    codice:
    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
    l'ultima riga dovrebbe indicare il valore 1, però differisce dal valore 1 che ho fatto stampare all'inizio ... ora proverò ad interpretare il valore dei bit memorizzati...

    p.s.: aggiungo anche

    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
    anche se i due valori "dovrebbero" essere tutti e due 1 :master:
    "Nessuno mi ha visto farlo, e non puoi provarlo in nessun modo!" (Bart Simpson)

    >>> www.ombresulweb.com <<<

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.