Dati numerici in .NET
.NET supporta una gamma di primitive intere e a virgola mobile numeriche, nonché:
- System.Half, che rappresenta un numero a virgola mobile a mezza precisione.
- System.Decimal, che rappresenta un numero decimale a virgola mobile.
- System.Numerics.BigInteger, che è un tipo integrale senza limite superiore o inferiore teorico.
- System.Numerics.Complex, che rappresenta i numeri complessi.
- Set di tipi abilitati per SIMD nello spazio dei nomi System.Numerics.
Tipi integer
.NET supporta tipi interi a 8, 16, 32, 64 e 128 bit con o senza segno, elencati nelle tabelle seguenti:
Tipi interi con segno
Type | Dimensioni (in byte) | Valore minimo | Valore massimo |
---|---|---|---|
System.Int16 | 2 | -32,768 | 32.767 |
System.Int32 | 4 | -2,147,483,648 | 2,147,483,647 |
System.Int64 | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
System.Int128 | 16 | −170,141,183,460,469,231,731,687,303,715,884,105,728 | 170,141,183,460,469,231,731,687,303,715,884,105,727 |
System.SByte | 1 | -128 | 127 |
System.IntPtr (nel processo a 32 bit) | 4 | -2,147,483,648 | 2,147,483,647 |
System.IntPtr (nel processo a 64 bit) | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
Tipi interi senza segno
Type | Dimensioni (in byte) | Valore minimo | Valore massimo |
---|---|---|---|
System.Byte | 1 | 0 | 255 |
System.UInt16 | 2 | 0 | 65.535 |
System.UInt32 | 4 | 0 | 4,294,967,295 |
System.UInt64 | 8 | 0 | 18,446,744,073,709,551,615 |
System.UInt128 | 16 | 0 | 340,282,366,920,938,463,463,374,607,431,768,211,455 |
System.UIntPtr (nel processo a 32 bit) | 4 | 0 | 4,294,967,295 |
System.UIntPtr (nel processo a 64 bit) | 8 | 0 | 18,446,744,073,709,551,615 |
Ogni tipo integer supporta un set di operatori aritmetici standard. La classe System.Math fornisce metodi per un set più ampio di funzioni matematiche.
È anche possibile operare sui singoli bit di un valore Integer usando la System.BitConverter classe.
Nota
I tipi integer senza segno non sono conformi a CLS. Per altre informazioni, vedere Indipendenza dal linguaggio e componenti indipendenti dal linguaggio.
BigInteger
La struttura System.Numerics.BigInteger è un tipo immutabile che rappresenta un integer arbitrariamente grande il cui valore in teoria non ha limiti inferiori o superiori. I metodi del tipo BigInteger sono strettamente paralleli a quelli di altri tipi integrali.
Tipi a virgola mobile
.NET include i tipi a virgola mobile seguenti:
Type | Dimensioni (in byte) | Intervallo approssimativo | Primitiva? | Note |
---|---|---|---|---|
System.Half | 2 | ±65504 | No | Introdotto in .NET 5 |
System.Single | 4 | ±3.4 x 1038 | Sì | |
System.Double | 8 | ±1.7 × 10308 | Sì | |
System.Decimal | 16 | ±7.9228 x 1028 | No |
I tipi Half, Single e Double supportano valori speciali che rappresentano un valore non numerico e infinito. Ad esempio, il tipo Double fornisce questi valori: Double.NaN, Double.NegativeInfinity e Double.PositiveInfinity. Per testare questi valori speciali, è necessario usare i metodi Double.IsNaN, Double.IsInfinity, Double.IsPositiveInfinity e Double.IsNegativeInfinity.
Ogni tipo a virgola mobile supporta un set di operatori aritmetici standard. La classe System.Math fornisce metodi per un set più ampio di funzioni matematiche. .NET core 2.0 e versioni successive include la classe System.MathF, che fornisce metodi che accettano argomenti del tipo Single.
È anche possibile operare sui singoli bit dei valori Double, Single e Half usando la classe System.BitConverter. La struttura System.Decimal dispone di metodi specifici, Decimal.GetBits e Decimal(Int32[]), che consentono di operare sui singoli bit di un valore decimale, nonché di un set di metodi specifici per l'esecuzione di altre operazioni matematiche.
I tipi Double, Single e Half sono destinati a essere usati per valori imprecisi per natura, ad esempio la distanza tra due stelle, e per applicazioni in cui non è necessario un livello elevato di precisione e gli errori di arrotondamento non devono essere minimi. Per i casi in cui è necessaria una maggiore precisione e gli errori di arrotondamento devono essere minimi, usare il tipo System.Decimal.
Nota
Il tipo Decimal non elimina la necessità di arrotondamento. Piuttosto, riduce al minimo gli errori dovuti all'arrotondamento.
Complex
La struttura System.Numerics.Complex rappresenta un numero complesso, ovvero un numero costituito da una parte numerica reale e una parte numerica immaginaria. Supporta un set standard di operatori aritmetici, di confronto, di uguaglianza, di conversione esplicita e di conversione implicita, oltre che metodi matematici, algebrici e trigonometrici.
Tipi abilitati per SIMD
Lo spazio dei nomi System.Numerics include un set di tipi .NET abilitati per SIMD. Operazioni SIMD (Single Instruction Multiple Data) possono essere eseguite in parallelo a livello hardware. Questo approccio aumenta la velocità effettiva dei calcoli vettorializzati, che sono comuni in app matematiche scientifiche e grafiche.
Tra i tipi .NET abilitati per SIMD sono inclusi i seguenti:
Tipi Vector2, Vector3 e Vector4, che rappresentano i vettori con 2, 3 e 4 valori Single.
Due tipi matrice: Matrix3x2, che rappresenta una matrice 3x2, e Matrix4x4, che rappresenta una matrice 4x4.
Tipo Plane, che rappresenta un piano nello spazio tridimensionale.
Tipo Quaternion, che rappresenta un vettore usato per codificare le rotazioni fisiche tridimensionali.
Tipo Vector<T>, che rappresenta un vettore di un tipo numerico specificato e fornisce un ampio set di operatori che traggono vantaggio dal supporto per SIMD. Il conteggio di un'istanza Vector<T> è fisso, ma il suo valore Vector<T>.Count dipende dalla CPU del computer, in cui viene eseguito codice.
Nota
Il tipo Vector<T> è incluso in .NET Core e .NET 5+, ma non in .NET Framework. Se si usa .NET Framework, installare il pacchetto NuGet System.Numerics.Vectors per ottenere l'accesso a questo tipo.
I tipi abilitati per SIMD vengono implementati in modo da poter essere usati con hardware non abilitato per SIMD in compilatori JIT. Per poter trarre vantaggio dalle istruzioni SIMD, le app a 64 bit devono essere eseguite dal runtime che usa il compilatore RyuJIT, che è incluso in .NET Core e in .NET Framework 4.6 e versioni successive. Aggiunge il supporto per SIMD quando i processori di destinazione sono a 64 bit.
Per altre informazioni, vedere Usare tipi numerici con accelerazione SIMD.