Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano operatory arytmetyczne, które są dostępne w języku F#.
Podsumowanie binarnych operatorów arytmetycznych
Operacje arytmetyczne w języku F# można wykonywać w dwóch trybach: niezaznaczone i Sprawdzony. Domyślnie operacje arytmetyczne używają niekontrolowanego zachowania, które stawiają wydajność na pierwszym miejscu, ale zezwalają na przepełnienie/podpełnienie. Sprawdzone operatory ustalają priorytety bezpieczeństwa, zgłaszając wyjątki w takich przypadkach.
Nieograniczone operatory arytmetyczne
W poniższej tabeli przedstawiono podsumowanie binarnych operatorów arytmetycznych, które są dostępne dla niezweryfikowanej arytmetyki z beznakładkowymi całkowitych i zmiennoprzecinkowych typów.
| Operator binarny | Notatki |
|---|---|
+ (dodawanie, plus) |
Niezaznaczone. Możliwy warunek przepełnienia, gdy liczby są dodawane razem, a suma przekracza maksymalną wartość bezwzględną obsługiwaną przez typ. |
- (odejmowanie, minus) |
Niezaznaczone. Możliwe przeciążenie, gdy odejmowane są typy bez znaku lub gdy wartości zmiennoprzecinkowe są zbyt małe, aby mogły być reprezentowane przez typ. |
* (mnożenie, czasy) |
Niezaznaczone. Potencjalne przepełnienie, gdy liczby są mnożone, a produkt przekracza maksymalną wartość bezwzględną supportowaną przez typ. |
/ (dzielenie, podzielone przez) |
Dzielenie przez zero powoduje DivideByZeroException dla typów całkowitych. W przypadku typów zmiennoprzecinkowych dzielenie według zera daje specjalne wartości zmiennoprzecinkowe infinity lub -infinity. Istnieje również możliwy warunek niedopełnienia, gdy liczba zmiennoprzecinkowa jest zbyt mała, aby była reprezentowana przez typ. |
% (pozostała część, rem) |
Zwraca pozostałą część operacji dzielenia. Znak wyniku jest taki sam jak znak pierwszego operandu. |
** (potęgowanie, do potęgi) |
Możliwy warunek przepełnienia, gdy wynik przekracza maksymalną wartość bezwzględną dla typu. Operator potęgowania działa tylko z typami zmiennoprzecinkowymi. |
Niekontrolowane zachowanie nie zgłasza wyjątków, gdy występuje przepełnienie lub niedopełnienie, co powoduje, że jest mniej bezpieczne dla arytmetyki na dużych wartościach lub w sytuacjach brzegowych.
Sprawdzone operatory arytmetyczne
W poniższej tabeli przedstawiono podsumowanie binarnych operatorów arytmetycznych, które są dostępne dla zaznaczonej arytmetyki z nieskrytymi typami całkowitymi. Sprawdzone operatory zapewniają, że obliczenia są weryfikowane pod kątem przepełnienia lub podpełnienia, zapewniając bezpieczniejsze operacje arytmetyczne dla krytycznych zastosowań.
| Operator binarny | Notatki |
|---|---|
+ (dodawanie, plus) |
Zgłasza OverflowException, jeśli wynik przekroczy maksymalną wartość lub spadnie poniżej minimalnej wartości obsługiwanej przez typ. Zarówno Overflow , jak i Underflow są możliwe. |
- (odejmowanie, minus) |
Zgłasza OverflowException, jeśli wynik przekroczy maksymalną wartość lub spadnie poniżej minimalnej wartości obsługiwanej przez typ. Zarówno Overflow , jak i Underflow są możliwe. |
* (mnożenie, czasy) |
Zgłasza OverflowException, jeśli produkt przekracza maksymalną wartość lub spada poniżej minimalnej wartości obsługiwanej przez typ. Zarówno Overflow , jak i Underflow są możliwe. |
Sprawdzone operatory są przydatne do zapewnienia, że przepełnienia arytmetyczne są przechwytywane i obsługiwane jawnie.
Oto przykład:
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.
Wybór pomiędzy operatorem sprawdzanym a niesprawdzanym
Operatory kontrolowane: Idealne w scenariuszach, w których błędy przepełnienia muszą być wykrywane i obsługiwane bezpośrednio.
Niezaznaczone operatory: Domyślnie język F# używa niezaznaczonej arytmetyki ze względów wydajności. Operacje te mogą bez ostrzeżenia generować nieprawidłowe wyniki, gdy wystąpi przepełnienie lub niedomiar. Należy zachować ostrożność.
Podsumowanie jednoargumentowych operatorów arytmetycznych
Poniższa tabela zawiera podsumowanie unarnych operatorów arytmetycznych, które są dostępne dla typów całkowitych i zmiennoprzecinkowych.
| Operator jednoargumentowy | Notatki |
|---|---|
+ (dodatnie) |
Można stosować do dowolnego wyrażenia arytmetycznego. Nie zmienia znaku wartości. |
- (negacja, ujemna) |
Można stosować do dowolnego wyrażenia arytmetycznego. Zmienia znak wartości. |
Zachowanie podczas przepełnienia lub podpełnienia dla typów liczb całkowitych polega na zawijaniu. Powoduje to nieprawidłowy wynik. Przepełnienie liczb całkowitych jest potencjalnie poważnym problemem, który może przyczynić się do problemów z zabezpieczeniami, gdy oprogramowanie nie jest napisane z uwzględnieniem tego. Jeśli jest to obawa dotycząca Twojej aplikacji, rozważ użycie operatorów kontrolnych w Microsoft.FSharp.Core.Operators.Checked.
Podsumowanie operatorów porównania binarnego
W poniższej tabeli przedstawiono operatory porównania binarnego, które są dostępne dla typów całkowitych i zmiennoprzecinkowych. Te operatory zwracają wartości typu bool.
Liczby zmiennoprzecinkowe nigdy nie powinny być porównywane bezpośrednio pod kątem równości, ponieważ reprezentacja zmiennoprzecinkowa IEEE nie obsługuje dokładnej operacji równości. Dwie liczby, które na pierwszy rzut oka można łatwo uznać za równe przy sprawdzaniu kodu, mogą mieć różne reprezentacje bitowe.
| Operator | Notatki |
|---|---|
= (równość, równa się) |
Nie jest to operator przypisania. Jest on używany tylko do porównania. Jest to operator ogólny. |
> (większe niż) |
Jest to operator ogólny. |
< (mniejsze niż) |
Jest to operator ogólny. |
>= (większe lub równe) |
Jest to operator ogólny. |
<= (mniejsze lub równe) |
Jest to operator ogólny. |
<> (nie równa się) |
Jest to operator ogólny. |
Przeciążone i uniwersalne operatory
Wszystkie operatory omówione w tym temacie są zdefiniowane w przestrzeni nazw Microsoft.FSharp.Core.Operators. Niektóre operatory są definiowane przy użyciu statycznie rozwiązanych parametrów typu. Oznacza to, że istnieją poszczególne definicje dla każdego określonego typu, który współpracuje z tym operatorem. Wszystkie jednoargumentowe i dwuargumentowe operatory arytmetyczne i bitowe znajdują się w tej kategorii. Operatory porównania są ogólne i dlatego działają z dowolnym typem, a nie tylko typami arytmetycznymi pierwotnymi. Typy związków dyskryminowanych i rekordów mają własne niestandardowe implementacje generowane przez kompilator F#. Typy klas używają metody Equals.
Operatory ogólne można dostosowywać. Aby dostosować funkcje porównania, zastąp Equals, aby stworzyć swoją własną niestandardową funkcję porównania równości, a następnie zaimplementuj IComparable. Interfejs System.IComparable ma jedną metodę , metodę CompareTo.
Operatory i wnioskowanie typów
Użycie operatora w wyrażeniu ogranicza wnioskowanie typu na tym operatorie. Ponadto użycie operatorów uniemożliwia automatyczne uogólnienie, ponieważ sugeruje typ arytmetyczny. W przypadku braku innych informacji kompilator języka F# wywnioskuje int jako typ wyrażeń arytmetycznych. To zachowanie można zastąpić, określając inny typ. W związku z tym typy argumentów i zwracany typ function1 w poniższym kodzie są wnioskowane jako int, ale typy function2 są wnioskowane jako 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
Zobacz też
- odwołania do symboli i operatorów
- przeciążenie operatora
- Operatory Bitowe
- operatory logiczne