Perché C# accetta l'inesattezza utilizzando punti galleggianti per memorizzare i dati?
"C#" non accetta il compromesso tra prestazioni e accuratezza; gli utenti lo accettano o no.
C# ha tre tipi di virgola mobile: float, double e decimal, perché questi tre tipi soddisfano la maggior parte delle esigenze dei programmatori del mondo reale.
float e double sono utili per calcoli "scientifici" in cui una risposta corretta a tre o quattro cifre decimali è sempre abbastanza vicina, poiché è la precisione con cui è stata eseguita la misura originale. Supponi di dividere 10,00 per 3 e di ottenere 3,3333333333333. Poiché la misura originale era probabilmente esatta solo a 0,01, il fatto che il risultato calcolato sia disattivato meno di 0,0000000000004 è irrilevante. Nei calcoli scientifici, non stai rappresentando le quantità esatte conosciute. L'imprecisione nella quindicesima cifra decimale è irrilevante se il valore di misurazione originale era solo preciso alla seconda cifra decimale.
Ovviamente questo non vale per i calcoli finanziari. Gli operandi per un calcolo finanziario sono solitamente precisi a due cifre decimali e rappresentano le quantità esatte. Il decimale va bene per i calcoli "finanziari" perché i risultati delle operazioni decimali sono esatti a condizione che tutti gli ingressi e le uscite possano essere rappresentati esattamente come decimali (e sono tutti in un intervallo ragionevole). I decimali hanno ancora errori di arrotondamento, ovviamente, ma le operazioni esatte sono esattamente quelle che probabilmente vorrai essere esatto quando esegui calcoli finanziari.
E qual è il vantaggio di utilizzarlo su altri metodi?
Si dovrebbe indicare quali altri metodi si desidera confrontare. Esistono moltissime tecniche diverse per eseguire calcoli sui computer.
Ad esempio, Math.Pow (Math.Sqrt (2), 2) non è esatto in C#. Esistono linguaggi di programmazione che possono calcolarlo esattamente (ad esempio, Mathematica).
Siamo chiari su questo punto; Mathematica non "calcola" esattamente la radice 2; il numero è irrazionale, quindi non può essere calcolato esattamente in una quantità limitata di spazio di archiviazione. Invece, ciò che Mathematica fa è che rappresenta i numeri come oggetti che descrivono come il numero è stato prodotto. Se dici "dammi la radice quadrata di due", allora Mathematica assegna essenzialmente un oggetto che significa "l'applicazione dell'operatore della radice quadrata al numero esatto 2". Se poi lo quadrati, ha una logica di scopo speciale che dice "se si piazza qualcosa che era la radice quadrata di qualcos'altro, restituire il valore originale". Mathematica ha oggetti che rappresentano anche vari numeri speciali, come il pi oe, e un enorme corpo di regole su come le varie manipolazioni di quei numeri si combinano insieme.
Fondamentalmente, è un simbolico sistema; manipola i numeri nello stesso modo in cui lo fanno le persone quando fanno matematica a matita e carta. La maggior parte dei programmi per computer manipola numeri come una calcolatrice: esegue immediatamente il calcolo e arrotondalo. Se ciò non è accettabile, dovresti attenersi a un sistema simbolico.
Un argomento che potrei pensare è che il calcolo esattamente è molto più lento poi basta affrontare l'inesattezza, ma Mathematica & Matlab vengono utilizzati per calcolare problemi scientifici giganteschi, quindi trovo difficile credere quelle lingue sono molto più lento di C#.
Non è che siano più lenti, anche se la moltiplicazione di punti mobili è davvero incredibilmente veloce sull'hardware moderno. È che il motore di calcolo simbolico è immensamente complesso. Codifica tutte le regole della matematica di base e ci sono molte di quelle regole! C# non è inteso per essere un motore di calcolo simbolico di livello professionale, è inteso per essere un linguaggio di programmazione generico.
MatLab viene eseguito in una sandbox Java. Se non credi che MatLab sia più lento, prova a creare un programma in tempo reale in MatLab. Sono stato lì, fatto quello, non è divertente ... :-) –
Ok, ma poi Wolfram Mathematica? Non riuscivo a trovare punti di riferimento su internet dove è rispetto a C# –
Il [CAS] (http://en.wikipedia.org/wiki/Computer_algebra_system) integrato nella calcolatrice TI-89 che praticamente mi ha fatto attraverso l'università corsi di matematica battiti anche i pantaloni della funzionalità matematica incorporata in .NET Framework. Il fatto è semplicemente che sono progettati per casi d'uso completamente diversi. –