C # Può memorizzare dati più precisi dei doppi?

double in C # non regge abbastanza precisione per le mie esigenze. Sto scrivendo un programma frattale e dopo aver ingrandito alcune volte ho perso la precisione.

C’è un tipo di dati che può contenere informazioni a virgola mobile più precise (cioè più posti decimali) di un doppio?

    Sì, decimal è progettato per questo.

    Tuttavia, si tenga presente che l’intervallo del tipo decimale è inferiore a un doppio. Quello è doppio può contenere un valore più grande, ma lo fa perdendo la precisione. Oppure, come dichiarato su MSDN:

    La parola chiave decimale indica un tipo di dati a 128 bit. Rispetto ai tipi a virgola mobile, il tipo decimale ha una precisione maggiore e un intervallo più piccolo, il che lo rende adatto per i calcoli finanziari e monetari. L’intervallo e la precisione approssimativi per il tipo decimale sono mostrati nella seguente tabella.

    La differenza principale tra decimal e double è che il decimal è a decimal fissa e il double è a virgola mobile . Ciò significa che il valore decimale memorizza un valore esatto, mentre il double rappresenta un valore rappresentato da una frazione ed è meno preciso. Un decimal è di 128 bit, quindi richiede il doppio spazio da memorizzare. Anche i calcoli su decimal sono più lenti (misura!).

    Se è necessaria una precisione ancora maggiore, è ansible utilizzare BigInteger da .NET 4. (Sarà necessario gestire i punti decimali da soli). Qui dovresti sapere che BigInteger è immutabile, quindi qualsiasi operazione aritmetica su di essa creerà una nuova istanza – se i numeri sono grandi, questo potrebbe essere paralizzante per le prestazioni.

    Ti suggerisco di esaminare esattamente quanto devi essere preciso. Forse il tuo algoritmo può funzionare con valori normalizzati, che possono essere più piccoli? Se le prestazioni sono un problema, è probabile che uno dei tipi a virgola mobile integrati sia più veloce.

    .NET Framework 4 introduce la struttura System.Numerics.BigInteger che può contenere numeri con una precisione arbitraria di grandi dimensioni.

    Dai un’occhiata a BigInteger (.NET 4) se ti serve una precisione ancora maggiore di quella Decimal .