Operatori aritmetici
In questo argomento vengono descritti gli operatori aritmetici disponibili in F#.
Riepilogo degli operatori aritmetici binari
Le operazioni aritmetiche in F# possono essere eseguite in due modalità: Non controllata e Controllata. Per impostazione predefinita, le operazioni aritmetiche usano un comportamento non controllato, che assegna priorità alle prestazioni, ma consente l'overflow/underflow. Gli operatori controllati assegnano priorità alla sicurezza generando eccezioni in tali casi.
Operatori aritmetici non controllati
Nella tabella seguente sono riepilogati gli operatori aritmetici binari disponibili per Aritmetica non selezionata con tipi integrali e a virgola mobile senzaboxing.
Operatore binario | Note |
---|---|
+ (addizione, più) |
Deselezionata. Possibile condizione di overflow quando i numeri vengono aggiunti insieme e la somma supera il valore assoluto massimo supportato dal tipo. |
- (sottrazione, meno) |
Deselezionata. Possibile condizione di underflow quando si sottraggono tipi non firmati o quando i valori a virgola mobile sono troppo piccoli per essere rappresentati dal tipo. |
* (moltiplicazione, tempi) |
Deselezionata. Possibile condizione di overflow quando i numeri vengono moltiplicati e il prodotto supera il valore assoluto massimo consentito dal tipo. |
/ (divisione, diviso per) |
La divisione per zero causa un DivideByZeroException per i tipi integrali. Per i tipi a virgola mobile, la divisione per zero fornisce i valori speciali a virgola mobile infinity o -infinity . Esiste anche una possibile condizione di underflow quando un numero a virgola mobile è troppo piccolo per essere rappresentato dal tipo. |
% (resto, rem) |
Restituisce il resto di un'operazione di divisione. Il segno del risultato è uguale al segno del primo operando. |
** (esponenziazione, alla potenza di) |
Possibile condizione di overflow quando il risultato supera il massimo valore assoluto per il tipo. L'operatore di esponenziazione funziona solo con tipi a virgola mobile. |
Il comportamento non verificato non genera eccezioni quando si verifica un overflow o un underflow, rendendolo meno sicuro per l'aritmetica su valori grandi o al limite.
Operatori aritmetici verificati
Nella tabella seguente vengono riepilogati gli operatori aritmetici binari disponibili per Aritmetica controllata con tipi integrali senza incapsulamento. Gli operatori controllati garantiscono che i calcoli siano verificati per overflow o underflow, offrendo un'aritmetica più sicura per le applicazioni critiche.
Operatore binario | Note |
---|---|
+ (addizione, più) |
Genera un OverflowException se il risultato supera il valore massimo o scende al di sotto del valore minimo supportato dal tipo . Sia overflow che underflow sono possibili. |
- (sottrazione, meno) |
Genera un OverflowException se il risultato supera il valore massimo o scende al di sotto del valore minimo supportato dal tipo . Sono possibili sia l'overflow che l'underflow . |
* (moltiplicazione, tempi) |
Genera un OverflowException se il prodotto supera il valore massimo o scende al di sotto del valore minimo supportato dal tipo. Sono possibili sia il overflow che il underflow . |
Gli operatori controllati sono utili per garantire che gli overflow aritmetici vengano rilevati e gestiti esplicitamente.
Ecco un esempio:
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.
Scelta tra operatori checked e unchecked
operatori verificati: l'ideale per scenari in cui gli errori di overflow devono essere rilevati e gestiti in maniera esplicita.
Operatori deselezionati: Per impostazione predefinita, F# usa un'aritmetica deselezionata per motivi di prestazioni. Queste operazioni possono produrre in modo invisibile all'utente risultati non corretti quando si verifica l'overflow o l'underflow. Usare con cautela.
Riepilogo degli operatori aritmetici unari
La tabella seguente riepiloga gli operatori aritmetici unari disponibili per i tipi integrali e a virgola mobile.
operatore unario | Note |
---|---|
+ (positivo) |
Può essere applicato a qualsiasi espressione aritmetica. Non modifica il segno del valore. |
- (negazione, negativo) |
Può essere applicato a qualsiasi espressione aritmetica. Modifica il segno del valore. |
Il comportamento in corrispondenza dell'overflow o dell'underflow per i tipi integrali è un ritorno al valore iniziale. Ciò causa un risultato non corretto. L'overflow integer è un problema potenzialmente grave che può contribuire ai problemi di sicurezza quando il software non viene scritto per tener conto di esso. Se questa è una preoccupazione per la tua applicazione, considera l'uso degli operatori controllati in Microsoft.FSharp.Core.Operators.Checked
.
Riepilogo degli operatori di confronto binario
La tabella seguente illustra gli operatori di confronto binari disponibili per i tipi integrali e a virgola mobile. Questi operatori restituiscono valori di tipo bool
.
I numeri a virgola mobile non devono mai essere confrontati direttamente per verificarne l'uguaglianza, perché la rappresentazione a virgola mobile IEEE non supporta un'operazione di uguaglianza esatta. Due numeri che è possibile verificare facilmente per essere uguali controllando il codice potrebbero effettivamente avere rappresentazioni di bit diverse.
Operatore | Note |
---|---|
= (uguaglianza, uguale) |
Non si tratta di un operatore di assegnazione. Viene usato solo per il confronto. Si tratta di un operatore generico. |
> (maggiore di) |
Si tratta di un operatore generico. |
< (minore di) |
Si tratta di un operatore generico. |
>= (maggiore o uguale a) |
Si tratta di un operatore generico. |
<= (minore o uguale a) |
Si tratta di un operatore generico. |
<> (diverso da) |
Si tratta di un operatore generico. |
Operatori sovraccaricati e generici
Tutti gli operatori descritti in questo argomento sono definiti nello spazio dei nomi Microsoft.FSharp.Core.Operators. Alcuni operatori vengono definiti usando parametri di tipo risolti in modo statico. Ciò significa che sono presenti singole definizioni per ogni tipo specifico che funziona con tale operatore. Tutti gli operatori aritmetici unari e binari e bitwise si trovano in questa categoria. Gli operatori di confronto sono generici e pertanto funzionano con qualsiasi tipo, non solo con tipi aritmetici primitivi. I tipi di unione e record discriminati hanno implementazioni personalizzate generate dal compilatore F#. I tipi di classe usano il metodo Equals.
Gli operatori generici sono personalizzabili. Per personalizzare le funzioni di confronto, sovrascriva Equals per fornire un confronto di uguaglianza personalizzato e quindi implementi IComparable. L'interfaccia System.IComparable dispone di un singolo metodo, il metodo CompareTo.
Operatori e inferenza dei tipi
L'uso di un operatore in un'espressione vincola l'inferenza del tipo relativo a quell'operatore. Inoltre, l'uso degli operatori impedisce la generalizzazione automatica, perché l'uso degli operatori implica un tipo aritmetico. In assenza di altre informazioni, il compilatore F# deduce int
come tipo di espressioni aritmetiche. È possibile eseguire l'override di questo comportamento specificando un altro tipo. Di conseguenza, i tipi di argomento e il tipo restituito di function1
nel codice seguente vengono dedotti come int
, ma i tipi per function2
vengono dedotti come 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
Vedere anche
- Riferimento a Simboli e Operatori
- Sovraccarico degli operatori
- operatori bit per bit
- operatori booleani