Números 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 vírgula flutuante de meia precisão.
- System.Decimal, que representa um número decimal de vírgula flutuante.
- 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 System.Numerics namespace.
Tipos inteiros
O .NET oferece suporte aos tipos inteiros de 8 bits, 16 bits, 32 bits, 64 bits e 128 bits assinados e não assinados, listados nas tabelas a seguir.
Tipos inteiros assinados
Type | 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 não assinados
Type | 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 de inteiro suporta um conjunto de operadores aritméticos padrão. A System.Math classe fornece métodos para um conjunto mais amplo de funções matemáticas.
Você também pode trabalhar com os bits individuais em um valor inteiro usando a System.BitConverter classe.
Nota
Os tipos inteiros não assinados não são compatíveis com CLS. Para obter mais informações, consulte Independência de idioma e componentes independentes de idioma.
BigInteger
A System.Numerics.BigInteger estrutura é 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 BigInteger tipo são muito paralelos aos dos outros tipos integrais.
Tipos de vírgula flutuante
O .NET inclui os seguintes tipos de ponto flutuante:
Type | Tamanho (em bytes) | Intervalo aproximado | Primitivo? | Notas |
---|---|---|---|---|
System.Half | 2 | ±65504 | Não | 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 | Não |
Os Halftipos , Single, e Double suportam valores especiais que representam não-um-número e infinito. Por exemplo, o Double tipo fornece os seguintes valores: Double.NaN, Double.NegativeInfinitye Double.PositiveInfinity. Use os Double.IsNaNmétodos , Double.IsInfinity, Double.IsPositiveInfinity, e para Double.IsNegativeInfinity testar esses valores especiais.
Cada tipo de ponto flutuante suporta um conjunto de operadores aritméticos padrão. A System.Math classe fornece métodos para um conjunto mais amplo de funções matemáticas. O .NET Core 2.0 e posterior inclui a System.MathF classe, que fornece métodos que aceitam argumentos do Single tipo.
Você também pode trabalhar com os bits individuais em Double, Singlee Half valores usando a System.BitConverter classe. A System.Decimal estrutura tem seus próprios métodos, Decimal.GetBits e Decimal(Int32[]), para trabalhar com bits individuais de um valor decimal, bem como seu próprio conjunto de métodos para executar algumas operações matemáticas adicionais.
Os Doubletipos , Singlee Half destinam-se a ser utilizados para valores que, pela sua natureza, são imprecisos (por exemplo, a distância entre duas estrelas) e para aplicações em que não é necessário um elevado grau de precisão e pequenos erros de arredondamento. Use o System.Decimal tipo para casos em que é necessária maior precisão e os erros de arredondamento devem ser minimizados.
Nota
O Decimal tipo não elimina a necessidade de arredondamento. Em vez disso, minimiza os erros devido ao arredondamento.
Complex
A System.Numerics.Complex estrutura representa um número complexo, isto é, um número com uma parte numérica real e uma parte numérica imaginária. Ele suporta um conjunto padrão de operadores de conversão aritmética, comparação, igualdade, explícitos e implícitos, bem como métodos matemáticos, algébricos e trigonométricos.
Tipos habilitados para SIMD
O System.Numerics namespace inclui um conjunto de tipos habilitados para .NET SIMD. As 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 vetorizados, que são comuns em aplicativos matemáticos, científicos e gráficos.
Os tipos habilitados para .NET SIMD incluem o seguinte:
O Vector2, Vector3, e Vector4 tipos, que representam vetores com 2, 3 e 4 Single valores.
Dois tipos de matriz, Matrix3x2, que representa uma matriz 3x2, e Matrix4x4, que representa uma matriz 4x4.
O Plane tipo, que representa um plano no espaço tridimensional.
O Quaternion tipo, que representa um vetor que é usado para codificar rotações físicas tridimensionais.
O Vector<T> tipo, que representa um vetor de um tipo numérico especificado e fornece um amplo conjunto de operadores que se beneficiam do suporte a SIMD. A contagem de uma Vector<T> instância é fixa, mas seu valor Vector<T>.Count depende da CPU da máquina, na qual o código é executado.
Nota
O Vector<T> tipo está incluído no .NET Core e no .NET 5+, mas não no .NET Framework. Se você estiver usando o .NET Framework, instale o pacote NuGet System.Numerics.Vectors para obter acesso a esse tipo.
Os tipos habilitados para SIMD são implementados de tal forma que podem ser usados com hardware não habilitado para SIMD ou compiladores JIT. Para aproveitar as instruções do SIMD, seus aplicativos de 64 bits devem ser executados pelo tempo de execução que usa o compilador RyuJIT, que está incluído no .NET Core e no .NET Framework 4.6 e versões posteriores. Ele adiciona suporte a SIMD ao direcionar processadores de 64 bits.
Para obter mais informações, consulte Usar tipos numéricos acelerados por SIMD.