Numéricos no .NET
O .NET fornece um intervalo de inteiros numéricos e primitivos de ponto flutuante, bem como:
- System.Half, que representa um número de ponto flutuante de meia precisão.
- System.Decimal, que representa um número de ponto flutuante decimal.
- System.Numerics.BigInteger, que é um tipo integral sem limite superior ou inferior teórico.
- System.Numerics.Complex, que representa números complexos.
- Um conjunto de tipos habilitados para SIMD no namespace System.Numerics.
Tipos de inteiro
O .NET oferece suporte a tipos inteiros assinados e não assinados de 8 bits, 16 bits, 32 bits, 64 bits e 128 bits, listados nas tabelas a seguir.
Tipos inteiros com sinal
Tipo | Tamanho (em bytes) | Valor mínimo | Valor máximo |
---|---|---|---|
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 (em processo de 32 bits) | 4 | -2,147,483,648 | 2\.147.483.647 |
System.IntPtr (em processo de 64 bits) | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
Tipos inteiros sem sinal
Tipo | Tamanho (em bytes) | Valor mínimo | Valor máximo |
---|---|---|---|
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 (em processo de 32 bits) | 4 | 0 | 4,294,967,295 |
System.UIntPtr (em processo de 64 bits) | 8 | 0 | 18,446,744,073,709,551,615 |
Cada tipo inteiro dá suporte a um conjunto de operadores aritméticos padrão. A classe System.Math fornece métodos para um conjunto mais amplo de funções matemáticas.
Você também pode trabalhar com os bits individuais nos valores usando a classe System.BitConverter.
Observação
Os tipos de inteiro sem sinal não estão em conformidade com CLS. Para obter mais informações, consulte Independência de linguagem e componentes de linguagem independente.
BigInteger
A estrutura System.Numerics.BigInteger é um tipo imutável que representa um inteiro arbitrariamente grande cujo valor, em teoria, não tem limites superiores ou inferiores. Os métodos do tipo BigInteger são muito semelhantes aos dos outros tipos integrais.
Tipos de ponto flutuante
O .NET inclui os seguintes tipos de ponto flutuante:
Tipo | Tamanho (em bytes) | Intervalo aproximado | Primitivo? | Observações |
---|---|---|---|---|
System.Half | 2 | ±65504 | No | Introduzido no .NET 5 |
System.Single | 4 | ±3.4 x 1038 | Sim | |
System.Double | 8 | ±1.7 × 10308 | Sim | |
System.Decimal | 16 | ±7.9228 x 1028 | No |
Os tipos Half, Single e Double dão suporte a valores especiais que representam não é um número e infinito. Por exemplo, o tipo Double fornece os seguintes valores: Double.NaN, Double.NegativeInfinity e Double.PositiveInfinity. Você usa os métodos Double.IsNaN, Double.IsInfinity, Double.IsPositiveInfinity e Double.IsNegativeInfinity para testar esses valores especiais.
Cada tipo de ponto flutuante dá suporte a um conjunto de operadores aritméticos padrão. A classe System.Math fornece métodos para um conjunto mais amplo de funções matemáticas. O .NET Core 2.0 e posterior inclui a classe System.MathF que fornece métodos que aceitam argumentos do tipo Single.
Também é possível trabalhar com os bits individuais em valores Double, Single e Half usando a classe System.BitConverter. A estrutura System.Decimal tem seus próprios métodos Decimal.GetBits e Decimal(Int32[]), para trabalhar com os bits individuais de um valor decimal, assim como seu próprio conjunto de métodos para executar algumas operações matemáticas adicionais.
Os tipos Double, Single e Half devem ser usados para valores que, devido à sua própria natureza, são imprecisos (por exemplo, a distância entre duas estrelas) e para aplicativos em que um alto grau de precisão e erro de arredondamento pequeno não são necessários. Use o tipo System.Decimal para casos que exigem maior precisão e os erros de arredondamento devem ser minimizados.
Observação
O tipo Decimal não elimina a necessidade de arredondamento. Em vez disso, ele minimiza erros devido a arredondamento.
Complex
A estrutura System.Numerics.Complex representa um número complexo, ou seja, um número com uma parte de número real e uma parte de número imaginário. Dá suporte a um conjunto padrão de aritmética, de comparação, de igualdade, de conversões explícita e implícita, bem como a métodos matemáticos, algébricos e trigonométricos.
Tipos habilitados para SIMD
O namespace System.Numerics inclui um conjunto de tipos habilitados para SIMD do .NET. Operações SIMD (Single Instruction Multiple Data) podem ser paralelizadas no nível de hardware. Isso aumenta a taxa de transferência dos cálculos vetorizadas, que são comuns em aplicativos matemáticos, científicos e gráficos.
Os tipos habilitados para SIMD do .NET incluem o seguinte:
Os tipos Vector2, Vector3 e Vector4, que representam vetores com 2, 3 e 4 valores de Single.
Dois tipos de matriz, Matrix3x2, que representa uma matriz 3x2, e Matrix4x4, que representa uma matriz 4x4.
O tipo Plane representa um plano no espaço tridimensional.
O tipo Quaternion, que representa um vetor usado para codificar rotações físicas tridimensionais.
O tipo Vector<T>, que representa um vetor de um tipo numérico especificado e fornece um amplo conjunto de operadores que se beneficiam de suporte a SIMD. A contagem de uma instância Vector<T> é corrigida, mas seu valor Vector<T>.Count depende da CPU do computador em que o código é executado.
Observação
O tipo Vector<T> está incluído no .NET Core e no .NET 5+, mas não no .NET Framework. Se estiver usando o .NET Framework, instale o pacote System.Numerics.Vectors NuGet para obter acesso a esse tipo.
Os tipos habilitados para SIMD são implementados de modo que possam ser usados com hardware não habilitados para SIMD ou compiladores JIT. Para aproveitar as instruções SIMD, os aplicativos de 64 bits deverão ser executados pelo runtime que utiliza o compilador RyuJIT, incluído no .NET Core e no .NET Framework 4.6 e versões posteriores. Ele adiciona suporte a SIMD quando tem processadores de 64 bits como destino.
Para obter mais informações, consulte Usar tipos numéricos acelerados por SIMD.