Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481

    Risultato assurdo ed errato in notazione esponenziale

    Ho uno script che fa un'operazione MOLTO semplice, prende un valore iniziale, decurta da questo valore n. valori e controlla che il risultato sia 0, quindi gli n. valori sommati devono essere uguali al valore iniziale...tutto bene se non fosse che in alcuni casi, il risultato anziché essere 0 è un valore in notazione esponenziale molto piccolo, parlo di E-14!
    Ho analizzato questi casi visualizzando i valori (il totale iniziale e i singoli n. valori), passandoli alla funzione floatval, in modo che se anche solo uno di questi fosse errato me ne sarei accorto, ma oltre che nessuno è sballato (max due cifre decimali ciascuno, dato che è una differenza progressiva, è impossibile arrivare ad un valore alla E-14!

    Avete qualche idea di come indagare?!?!

  2. #2
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    esempio pratico:
    Codice PHP:
    $valore_iniziale 931.70;
    $valore_iniziale -= 165.9;
    $valore_iniziale -= 350;
    $valore_iniziale -= 415.8;
    echo 
    $valore_iniziale// che mi aspetto sia zero
    // 5.6843418860808E-14 

  3. #3
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    chiaramente i valori non sono inseriti in PHP ma inseriti tramite un form, quindi, ho arricchito questa parte di codice con il floatval

    Codice PHP:
    $valore_iniziale $_POST['valore_iniziale']; // pari a 931.70;
    echo floatval($valore_iniziale);

    $valore_iniziale -= $_POST['valore'][1]; // 165.9;
    echo $_POST['valore'][1];

    $valore_iniziale -= $_POST['valore'][2]; // 350;
    echo $_POST['valore'][2];

    $valore_iniziale -= $_POST['valore'][3]; // 415.8;
    echo $_POST['valore'][3];

    echo 
    $valore_iniziale// che mi aspetto sia zero
    // 5.6843418860808E-14 
    come immaginate tutti gli echo delle chiamate ai floatval di tutti i valori mostrano che nessun valore è diverso da quelli mostrati, nessuno arriva a 14 cifre decimali! Quindi...come è possibile tutto ciò?!

    Ed ultima cosa, il problema insorge solo nell'ultima sottrazione, perché poi ho esaminato anche il floatval di $valore_iniziale prima e dopo ogni operazione aritmetica, e diventa approssimato così solo dopo l'ultima sottrazione.

  4. #4
    E' un problema noto intrinseco al modo in cui i computer registrano i numeri in virgola mobile. Leggi ad esempio: http://stackoverflow.com/questions/3...math-precision

  5. #5
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da k.b
    E' un problema noto intrinseco al modo in cui i computer registrano i numeri in virgola mobile. Leggi ad esempio: http://stackoverflow.com/questions/3...math-precision
    quindi devo per forza convertire sempre e cmq tutti i risultati in virgola mobile per evitare cose del genere? Tipo con il Round?

  6. #6
    round() o number_format():

    Codice PHP:
    $valore_iniziale 931.70;
    $valore_iniziale -= 165.9;
    $valore_iniziale -= 350;
    $valore_iniziale -= 415.8;
    echo 
    number_format($valore_iniziale2); 

  7. #7
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da k.b
    round() o number_format():

    Codice PHP:
    $valore_iniziale 931.70;
    $valore_iniziale -= 165.9;
    $valore_iniziale -= 350;
    $valore_iniziale -= 415.8;
    echo 
    number_format($valore_iniziale2); 
    forse non mi crederai ma non ho mai sentito di questo problema...grazie mille, pensavo di essere "cecato" nel non vedere un errore stupido e palese...

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