Dati numerici in .NET

.NET supporta una gamma di primitive intere e a virgola mobile numeriche, nonché:

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
System.Double 8 ±1.7 × 10308
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.

Vedi anche