Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: float impazziti :-)

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    18

    Sarò cretino io?

    Molto probabile che io non veda qualcosa ma...
    Questa funzione dovrebbe stampare uguale: 5 quando il ciclo arriva a 5 no?
    A me non lo stampa :|
    <?
    for($i=1.0; $i <= 10.0; $i += 0.1) {
    if($i == 5.0)
    print "uguale: ".$i;
    }
    ?>

    se invece la scrivo cosi si

    <?
    for($i=1.0; $i <= 10.0; $i += 0.1) {
    if($i."" == 5.0) //notare la conversione a stringa
    print "uguale: ".$i;
    }
    ?>

    e anche cosi senza convertirla a stringa ma cambiando l'incremento

    <?
    for($i=1.0; $i <= 10.0; $i += 0.5) {
    if($i == 5.0)
    print "uguale: ".$i;
    }
    ?>

    e anche cosi

    <?
    for($i=1.0; $i <= 10.0; $i += 0.25) {
    if($i == 5.0)
    print "uguale: ".$i;
    }
    ?>

    Se la matematica non è un opinione non dovrebbe essere giusta anche la prima?
    Dove e cosa sbaglio?

    fuori da un for ovviamente funziona tutto
    $i = 5.0;
    if($i == 5.0)
    print "uguale: ".$i;

  2. #2

  3. #3
    Io invece ti suggerisco di leggere il regolamento, il titolo non era a norma.
    L'ho modificato io perché è il tuo primo messaggio ma i prossimi ti saranno chiusi.
    Ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    18
    Pare sia un problema di perdita di precisione dovuta al non poter esprimere correttamente tutti i numeri decimali.
    Sommando di 0.1 arrivato a 5 (ma lo farebbe anche con altri numeri) non da esattamente 5 ma un numero compreso tra 5 e 5.1.

    e difatti con un if($i > 5.0 && i < 5.1) il print lo fa.

    Pur avendo capito la logica che ci sta dietro mi sembra cmq assurdo che io sappia fare una cosa del genere su carta e un calcolatore no.

    Ne prendo atto ^^

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    18
    Originariamente inviato da bubu77
    Io invece ti suggerisco di leggere il regolamento, il titolo non era a norma.
    L'ho modificato io perché è il tuo primo messaggio ma i prossimi ti saranno chiusi.
    Ciao
    Si mi era venuto il dubbio chiedo scusa

  6. #6
    Pur avendo capito la logica che ci sta dietro mi sembra cmq assurdo che io sappia fare una cosa del genere su carta e un calcolatore no.
    Sei in grado di fare su carta delle operazioni in virgola mobile con una precisione di circa 14 cifre decimali?

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    18
    No mi son spiegato male.

    I calcoli del calcolatore sono ovviamente precisi più dei nostri che approssimiamo.
    Ma se l'iteratore agisce sui decimi perchè mai dovrebbe sputarmi fuori un numero compreso tra 5.0 e 5.1 quindi evidentemente un numero non approssimato ai decimi?

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    18
    Se a qualcuno servisse cmq basta usare la funzione round($i,1) che messa nell'if

    if(round($i,1) == 5.0)

    arrotonda ai decimali e verifica il condizionale.

    Davo per scontato che un linguaggio di alto livello facesse in automatico l'arrotondamento in base all'iteratore che si inseriva. E sinceramente non mi ero mai imbattuto in una cosa simile prima ^^.

    Mi confermate che è cosi per tutti i linguaggi(e quindi va sempre fatto a posteriori l'arrotondamento) o alcuni lo fanno e altri no?

  9. #9
    Originariamente inviato da Salazar
    sinceramente non mi ero mai imbattuto in una cosa simile prima ^^.
    quanto tempo è che programmi e con quali linguaggi?



    Originariamente inviato da Salazar
    Mi confermate che è cosi per tutti i linguaggi(e quindi va sempre fatto a posteriori l'arrotondamento) o alcuni lo fanno e altri no?
    è un problema di quasi tutti i linguaggi e il round dovresti farlo per ogni somma, non solo alla fine poichè farlo solo alla fine significa rischiare di perdersi un .1 e fallire il check

    codice:
    while(round($i, 1) != 5.0)
        $i = round($i, 1) + 0.1;


    P.S. io pensavo JavaScript non soffrisse di questo problema, invece perfino "il più scripting" ce l'ha
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    18
    Son giovane quindi non si può dire che programmi da una vita ne che conosca chissà quali linguaggi.
    Poi il fatto di non essermi imbattuto in questa problematica, nei programmi che son andato a fare sino ad ora(quindi non fare confronti tra float dopo calcoli ripetuti in virgola mobile) non mi pare cosi scandaloso.

    Considero l'accaduto come un ottimo spunto per imparare una cosa in più, per quanto basilare possa essere. Non vedo il motivo di dar certe risposte. Sin dall'inizio ho chiesto un parere di altri non ho mai preteso di avere chissà quale conoscenza superiore.

    La gente che ne sa di più potrebbe tranquillamente evitare di postare se la mia ignoranza li ferisce nel profondo.

    Senza crear polemica per una cosa inutile, ringrazio tutti quelli che mi han fatto notare l'errore e la mia erronea convinzione.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.