Domanda

Tutti i metodi di System.Math prende double come parametri e restituisce i parametri. Le costanti sono anche di tipo double. Ho controllato MathNet.Numerics , e lo stesso sembra essere il caso lì.

Perché è questo? Soprattutto per le costanti. Non è decimal dovrebbe essere più precisi? Non sarebbe che spesso tipo di utile quando fare calcoli?

È stato utile?

Soluzione

Questo è un classico commercio velocità-versus-off precisione.

Tuttavia, tenere presente che per PI, per esempio, la maggior parte delle cifre di cui avete bisogno è 41.

  

Il maggior numero di cifre di pi   che si potrà mai bisogno è 41. Per   calcolare la circonferenza del   universo con un errore inferiore al   diametro di un protone, è necessario 41   cifre di pi †. Sembra sicuro   concludere che 41 cifre è sufficiente   la precisione in pi per qualsiasi cerchio   problema di misura è molto probabile che   incontrare. Così, nella più di un   trilione di cifre di pi calcolati in   2002 tutte le cifre al di là del 41 ° hanno   alcun valore pratico.

Inoltre, decimale e doppio hanno una leggermente diversa struttura di archiviazione interna. Decimali sono progettati per memorizzare base di 10 elementi, ove come doppie (e galleggianti), sono fatte per contenere dati binari. Su una macchina binario (come tutti i computer esistente) un doppio avranno meno bit sprecati quando la memorizzazione di un numero qualsiasi all'interno del suo campo.

Guarda anche:

System.Double      8 bytes    Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures
System.Decimal    12 bytes    Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures

Come si può vedere, decimale ha una gamma più piccola, ma una maggiore precisione.

Altri suggerimenti

No, - decimali non sono più "esatta" che raddoppia, o per quella materia, qualsiasi tipo. Il concetto di " esattezza ", (quando si parla di rappresentazioni numeriche in un compuiter), è ciò che è sbagliato. Qualsiasi tipo è assolutamente al 100% esatto a rappresentare alcuni i numeri. byte senza segno sono al 100% esatto a rappresentare i numeri interi da 0 a 255. ma sono non va bene per le frazioni o negativi o interi di fuori del campo.

decimali sono 100% esatto a rappresentare un certo insieme di di base 10 valori. raddoppia (dal momento che memorizzano il loro valore con binario IEEE rappresentazione esponenziale) sono esatte a rappresentare una serie di binari i numeri . Nessuno dei due è più precisa di quanto rispetto agli altri, in generale, sono semplicemente per scopi diversi.

Per elaborare un po 'furthur, dal momento che mi sembra di non essere abbastanza chiaro per alcuni lettori ...

Se si prende ogni numero che è rappresentabile come un decimale, e Mark ognuno di loro su una linea di serie, tra tutti coppia adiacente di loro v'è un ulteriore infinity di numeri reali, che sono non rappresentabile come un decimale. La stessa dichiarazione precisa può essere fatta circa i numeri che possono essere rappresentati come un doppio. Se si segna ogni decimale sulla linea dei numeri in blu, ed ogni doppio in rosso, tranne che per gli interi, ci sarebbero ben pochi posti in cui lo stesso valore è stato caratterizzato in entrambi i colori. In generale, per 99,99999% dei marchi, (per favore non pignoli la mia percentuale) l'insieme blu (decimali) è una serie completamente diversa di numeri dal set rosso (il doppio).

Questo perché la nostra stessa definizione per il set blu è che è una rappresentazione di base 10 mantissa / esponente, e un letto è una base 2 mantissa rappresentazione / esponente. Qualsiasi valore rappresentato come base 2 mantissa e dell'esponente, (1.00110101001 x 2 ^ (-11101001101001) intende prendere il valore mantissa (1.00110101001) e moltiplicarlo per 2 elevato alla potenza dell'esponente (quando esponente è negativo è equivilent a dividere per 2 alla potenza del valore assoluto dell'esponente). Ciò significa che se l'esponente è negativo, (o dove qualsiasi parte della mantissa è un binario frazionaria) il numero non può essere rappresentato come una mantissa decimale ed esponente, e viceversa.

Per qualsiasi numero reale arbitrario, che cade casualmente sul reale linea numero, sarà o più vicino ad uno dei decimali blu, o di uno dei doppi rossi.

decimale è più preciso ma ha meno di un intervallo. Si potrebbe utilizzare in genere doppio per la fisica e calcoli matematici, ma si usa decimale per i calcoli finanziari e monetari.

Vedere i seguenti articoli su MSDN per i dettagli.

Doppia http://msdn.microsoft.com/en-us/library/678hzkk9. aspx

Decimale http://msdn.microsoft.com/en-us/library/364x0z75. aspx

Sembra che la maggior parte degli argomenti qui a "non fa quello che voglio" sono "ma è più veloce", così lo è anche libreria ANSI C + Gmp, ma nessuno sta sostenendo che in questo?

Se si desidera controllare in particolare la precisione, poi ci sono altre lingue, che hanno avuto il tempo per implementare precisione esatta, in modo controllabile utente:

http://www.doughellmann.com/PyMOTW/decimal/

Se la precisione è veramente importante per voi, allora siete probabilmente meglio utilizzando linguaggi che i matematici avrebbero usato. Se non ti piace, allora Fortran Python è una moderna alternativa.

Qualunque sia la lingua che si sta lavorando, ricordate la regola d'oro:  Evitare tipi di miscelazione ...  Quindi la conversione a e b essere lo stesso prima di tentare un operatore di b

Se dovessi azzardare un'ipotesi, direi che quelle funzionalità di basso livello per la matematica funzioni leva finanziaria (forse in C) che non utilizza decimali internamente e quindi la restituzione di un decimale richiederebbe un cast da doppia a decimale in ogni caso. Inoltre, lo scopo del tipo valore decimale è per assicurare la precisione; queste funzioni non fanno e non possono tornare al 100% i risultati esatti senza precisione infinita (per esempio, numeri irrazionali).

Né decimale né galleggiare o doppia sono abbastanza buoni se hai bisogno di qualcosa per essere precisi. Inoltre, decimale è così costoso e abusato là fuori sta diventando una barzelletta regolare.

Se si lavora in frazioni e richiedono massima precisione, usare le frazioni. E 'stessa regola vecchia, convertire una sola volta e solo quando è necessario. Anche le regole di arrotondamento varieranno per app, di dominio e così via, ma sicuro che potete trovare un esempio dispari o due in cui è adatto. Ma ancora una volta, se si vuole frazioni e massima precisione, la risposta è di non usare nulla, ma le frazioni. Considerate si potrebbe desiderare una caratteristica di precisione arbitraria pure.

Il problema vero e proprio con CLR, in generale, è che è così strano e pianura rotto per implementare una libreria che si occupa di valori numerici in maniera generica in gran parte a causa di una cattiva progettazione primitivo e difetto del compilatore più importante per la piattaforma. E 'quasi lo stesso con Java fiasco.

doppia solo risulta essere il miglior compromesso che copre la maggior parte dei domini, e funziona bene, nonostante il fatto MS JIT è ancora in grado di utilizzare una tecnologia CPU che è di circa 15 anni ormai.

[pezzo per gli utenti di MSDN compilatori rallentamento]

Double è un tipo built-in. È è supportato da nucleo FPU / SSE (precedentemente conosciuto come "coprocessore Math"), è per questo che è incredibilmente veloce. Soprattutto a moltiplicazione e funzioni scientifiche.

decimale è in realtà una struttura complessa, costituito da più interi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top