errore di numero fluttuante con una semplice sottrazioneNon posso dire se JMP può sottrarre correttamente due numeri semplici, ma ho provato i seguenti numeri:
16,11-15,12
0,99 (ok, finora tutto bene)
15,29-15,18
0.109999999999999 (non più buono)
15,29-15,19
0.099999999999999997 (un sette?)
Allora, dov'è il gancio che ho sbagliato?
Questo succede con JMP 12.2.0 (64-bit) nell'editor degli script.
Ri: errore di numero fluttuante con una semplice sottrazioneHo deciso di usare
format(mean(y),6)
quindi nel report un numero molto piccolo viene convertito in 1.574e-6 e non occupa molto spazio.
ma
Format( 1.2345, "Precision", 3)
sarebbe il modo per "cifre significative".
Ri: errore di numero fluttuante con una semplice sottrazionePer quanto riguarda le "cifre significative", puoi ottenerlo usando il formato "Precisione" con la funzione "Formato". Inoltre, la funzione "Char" supporta due argomenti addizione, uno per la larghezza e uno per il numero di cifre decimali, se si desidera saltare l'operazione Round per la visualizzazione.
Char( 15.29 - 15.19, 10, 2); // "0.10"
Format( 12.345, "Precision", 3); // "12.3"
Format( 1.2345, "Precision", 3); // "1.23"
Riguardo al problema originale, si riduce al fatto che i computer memorizzano i numeri in base 2 (binari) ma li visualizzano in base 10, e alcuni numeri di base 10 come "0.1" non hanno una rappresentazione esatta nella base 2.
Ri: errore di numero fluttuante con una semplice sottrazioneNon sono sicuro di cosa stai chiedendo. Se stai chiedendo se queste funzioni hanno l'opzione di specificare cifre significative oltre al numero di cifre decimali, la risposta è no. Se stai chiedendo se prenderei in considerazione l'aggiunta di una tale opzione, allora quella richiesta è una questione di sviluppo JMP.
Ri: errore di numero fluttuante con una semplice sottrazioneTHX per gli input, piccola domanda, consideri un'opzione come "n cifre significative" per show, char e round? sarebbe di grande aiuto.
Ri: errore di numero fluttuante con una semplice sottrazioneSolo per illustrare il problema NON è un problema JMP, ecco cosa succede in Excel.
| X |
Y |
Formula X - Y |
| 16.11 |
15.12 |
0,99000000000000000 |
| 15.29 |
15.18 |
,10999999999999900 |
| 15.29 |
15.19 |
,09999999999999960 |
Ri: errore di numero fluttuante con una semplice sottrazioneCapisco. Il mio esempio con la funzione Round () aveva il solo scopo di illustrare un metodo per gestire la precisione limitata del numero in virgola mobile e l'aritmetica associata. È possibile creare soluzioni più complete per gestire casi più complessi.
Hai usato Aiuto > Libri > Guida per lo scripting o Aiuto > Indice di scripting per vedere le funzionalità delle funzioni Round () o Char ()?
Ri: errore di numero fluttuante con una semplice sottrazionePotresti voler leggere questa risorsa: Precisione numerica JMP È possibile trovare tali white paper per altri software popolari come fogli di calcolo. È un problema noto ma generalmente non è un problema.
Ri: errore di numero fluttuante con una semplice sottrazionenon silenzioso, per "estenderlo" un po '(e il motivo per cui mi infastidisce) è che la precisione dipende dall'input dell'utente
Se usa 15.29mm e 15.19mm otterrà 0.1mm corretti con Round (x, 2).
Se usa 0,01529m e 0,01519m otterrà 0m e probabilmente starà sulla mia porta dopo aver visto il risultato * g *
E non riesco a vedere se le "cifre significative" sono supportate come round o char.
Ri: errore di numero fluttuante con una semplice sottrazioneNel matematica , l'aritmetica semplice darebbe risultati esatti in queste differenze: 15.29 - 15.18 = 0.11 e 15.29 - 15. 19 = 0,10. Ma il risultato in JMP è aritmetica di precisione finita in un computer. Il risultato dipende da come il numero reale è rappresentato come un numero in virgola mobile e come funzionano gli operatori aritmetici. Con questa rappresentazione. Non è difficile trovare casi in cui il risultato dell'operatore e il risultato matematico non sono d'accordo.
JMP potrebbe utilizzare una libreria software numerica a virgola mobile standard o un processore hardware in virgola mobile dedicato per tali operazioni.
Esistono alcuni software che utilizzano una precisione estesa o "illimitata" (limitata solo dalle risorse fisiche) ma generalmente non modifica i risultati pratici nei nostri metodi statistici, come la regressione.
Una soluzione nel tuo caso è arrotondare il risultato in una formula o uno script:
Round( 15.2900000 - 15.1900000, 2 )
Quindi ottieni 0,1 per il risultato. Problema risolto.