Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico descreve operadores aritméticos que estão disponíveis em F#.
Resumo dos operadores aritméticos binários
As operações aritméticas em F# podem ser executadas em dois modos: Desmarcado e Verificado. Por padrão, as operações aritméticas usam um comportamento desmarcado, que prioriza o desempenho, mas permite estouro/subfluxo. Os operadores verificados priorizam a segurança lançando exceções nesses casos.
Operadores aritméticos desmarcados
A tabela a seguir resume os operadores aritméticos binários que estão disponíveis para a Aritmética Desmarcada com tipos de ponto flutuante e integrais sem caixa.
| Operador binário | Anotações |
|---|---|
+ (adição, mais) |
Não marcado. Possível condição de estouro quando os números são adicionados e a soma excede o valor absoluto máximo suportado pelo tipo. |
- (subtração, menos) |
Não marcado. Possível condição de subfluxo quando tipos não assinados são subtraídos ou quando os valores de ponto flutuante são muito pequenos para serem representados pelo tipo. |
* (multiplicação, horários) |
Não marcado. Possível condição de estouro quando os números são multiplicados e o produto excede o valor absoluto máximo suportado pelo tipo. |
/ (divisão, dividida por) |
A divisão por zero causa um DivideByZeroException para tipos integrais. Para tipos de ponto flutuante, a divisão por zero fornece os valores infinity especiais de ponto flutuante ou -infinity. Também há uma possível condição de subfluxo quando um número de ponto flutuante é muito pequeno para ser representado pelo tipo. |
% (restante, rem) |
Retorna o restante de uma operação de divisão. O sinal do resultado é o mesmo que o sinal do primeiro operando. |
** (exponencialização, ao poder de) |
Condição de estouro possível quando o resultado excede o valor absoluto máximo do tipo. O operador de exponencialização funciona apenas com tipos de ponto flutuante. |
O comportamento desmarcado não gera exceções quando ocorre estouro ou subfluxo, tornando-o menos seguro para aritmética em valores grandes ou de borda.
Operadores aritméticos verificados
A tabela a seguir resume os operadores aritméticos binários que estão disponíveis para a Aritmética Marcada com tipos integrais sem caixa. Os operadores verificados garantem que os cálculos sejam verificados para estouro ou subfluxo, fornecendo aritmética mais segura para aplicativos críticos.
| Operador binário | Anotações |
|---|---|
+ (adição, mais) |
Gerará um OverflowException se o resultado exceder o valor máximo ou ficar abaixo do valor mínimo suportado pelo tipo. Estouro e Subfluxo são possíveis. |
- (subtração, menos) |
Gerará um OverflowException se o resultado exceder o valor máximo ou ficar abaixo do valor mínimo suportado pelo tipo. Estouro e Subfluxo são possíveis. |
* (multiplicação, horários) |
Gerará um OverflowException se o produto exceder o valor máximo ou ficar abaixo do valor mínimo suportado pelo tipo. Estouro e Subfluxo são possíveis. |
Os operadores verificados são úteis para garantir que estouros aritméticos sejam capturados e tratados explicitamente.
Aqui está um exemplo:
open Microsoft.FSharp.Core.Operators.Checked
let safeAddition () =
try
let result = 2147483647 + 1 // Attempt to add integers at their maximum boundary
printfn "Result: %d" result
with
| :? System.OverflowException as ex ->
printfn "Overflow occurred: %s" ex.Message
safeAddition()
// Output:
// Overflow occurred: Arithmetic operation resulted in an overflow.
Escolhendo entre operadores verificados e desmarcados
Operadores verificados: Ideal para cenários em que erros de estouro devem ser detectados e tratados explicitamente.
Operadores desmarcados: Por padrão, o F# usa aritmética desmarcada por motivos de desempenho. Essas operações podem produzir silenciosamente resultados incorretos quando ocorre estouro ou subfluxo. Use-o com cuidado.
Resumo dos operadores aritméticos unários
A tabela a seguir resume os operadores aritméticos unários que estão disponíveis para tipos integrais e de ponto flutuante.
| Operador unário | Anotações |
|---|---|
+ (positivo) |
Pode ser aplicado a qualquer expressão aritmética. Não altera o sinal do valor. |
- (negação, negativo) |
Pode ser aplicado a qualquer expressão aritmética. Altera o sinal do valor. |
O comportamento em estouro ou subfluxo para tipos integrais é encapsular. Isso causa um resultado incorreto. O estouro de inteiros é um problema potencialmente sério que pode contribuir para problemas de segurança quando o software não é gravado para contabilizar isso. Se isso for uma preocupação para seu aplicativo, considere usar os operadores verificados em Microsoft.FSharp.Core.Operators.Checked.
Resumo dos operadores de comparação binária
A tabela a seguir mostra os operadores de comparação binária disponíveis para tipos integrais e de ponto flutuante. Esses operadores retornam valores do tipo bool.
Os números de ponto flutuante nunca devem ser comparados diretamente quanto à igualdade, pois a representação de ponto flutuante do IEEE não dá suporte a uma operação de igualdade exata. Dois números que você pode verificar facilmente como iguais inspecionando o código podem ter representações de bits diferentes.
| Operador | Anotações |
|---|---|
= (igualdade, igual a) |
Este não é um operador de atribuição. Ele é usado apenas para comparação. Esse é um operador genérico. |
> (maior que) |
Esse é um operador genérico. |
< (menor que) |
Esse é um operador genérico. |
>= (maior ou igual a) |
Esse é um operador genérico. |
<= (menor ou igual a) |
Esse é um operador genérico. |
<> (não é igual) |
Esse é um operador genérico. |
Operadores sobrecarregados e genéricos
Todos os operadores discutidos neste tópico são definidos no namespace Microsoft.FSharp.Core.Operators . Alguns dos operadores são definidos usando parâmetros de tipo resolvidos estaticamente. Isso significa que há definições individuais para cada tipo específico que funciona com esse operador. Todos os operadores aritméticos e bit aritméticos binários e unários estão nessa categoria. Os operadores de comparação são genéricos e, portanto, funcionam com qualquer tipo, não apenas com tipos aritméticos primitivos. Os tipos de registro e união discriminados têm suas próprias implementações personalizadas que são geradas pelo compilador F#. Os tipos de classe usam o método Equals.
Os operadores genéricos são personalizáveis. Para personalizar as funções de comparação, substitua Equals para fornecer sua própria comparação de igualdade personalizada e implemente IComparable. A System.IComparable interface tem um único método, o CompareTo método.
Operadores e inferência de tipo
O uso de um operador em uma expressão restringe a inferência de tipo nesse operador. Além disso, o uso de operadores impede a generalização automática, pois o uso de operadores implica um tipo aritmético. Na ausência de qualquer outra informação, o compilador F# infere int como o tipo de expressões aritméticas. Você pode substituir esse comportamento especificando outro tipo. Portanto, os tipos de argumento e o tipo de retorno do function1 código a seguir são inferidos para serem int, mas os tipos para function2 os quais são inferidos serão float.
// x, y and return value inferred to be int
// function1: int -> int -> int
let function1 x y = x + y
// x, y and return value inferred to be float
// function2: float -> float -> float
let function2 (x: float) y = x + y
Consulte também
- Referência de símbolo e operador
- Sobrecarga de operador
- operadores bit a bit
- Operadores Boolianos