Aritmetické operátory
Toto téma popisuje aritmetické operátory, které jsou k dispozici v jazyce F#.
Souhrn binárních aritmetických operátorů
Aritmetické operace v jazyce F# lze provádět ve dvou režimech: Nezaškrtnuto a Zaškrtnuté. Aritmetické operace ve výchozím nastavení používají nekontrolované chování, které upřednostňuje výkon, ale umožňuje přetečení či podtečení. Kontrolované operátory upřednostňují bezpečnost vyvoláním výjimek v takových případech.
Neověřené aritmetické operátory
Následující tabulka shrnuje binární aritmetické operátory, které jsou k dispozici pro Nesprávnou aritmetiku s neobalenými celočíselnými a plovoucími typy.
Binární operátor | Poznámky |
---|---|
+ (sčítání, plus) |
Nezaškrtnuto. Možná podmínka přetečení, když se čísla přičtou dohromady a součet překročí maximální absolutní hodnotu podporovanou typem. |
- (odčítání, minus) |
Nezaškrtnuto. Možné podtečení, pokud dochází k odčítání bezznaménkových typů, nebo pokud jsou hodnoty s plovoucí desetinnou čárkou příliš malé na to, aby je daný typ dokázal reprezentovat. |
* (násobení, časy) |
Nezaškrtnuto. Možné přetečení, když se čísla vynásobí a součin překročí maximální absolutní hodnotu, kterou typ podporuje. |
/ (dělení, děleno) |
Dělení nulou vyvolá DivideByZeroException pro integrální typy. Pro typy desetinných čísel dělení nulou poskytuje speciální hodnoty infinity nebo -infinity . Existuje také možné přílišné podtečení, pokud je plovoucí desetinné číslo příliš malé, aby bylo reprezentováno daným typem. |
% (zbytek, rem - zbývající) |
Vrátí zbytek po operaci dělení. Znaménko výsledku je stejné jako znaménko prvního operandu. |
** (exponentiace, mocnina) |
Možná podmínka přetečení, pokud výsledek překročí maximální absolutní hodnotu pro daný typ. Operátor exponentiation funguje pouze s typy s plovoucí desetinnou čárkou. |
Neomezené chování nevyvolá výjimky, když dojde k přetečení nebo podtečení, takže je méně bezpečné pro výpočty s velkými nebo hraničními hodnotami.
Kontrolované aritmetické operátory
Následující tabulka shrnuje binární aritmetické operátory, které jsou k dispozici pro kontrolovanou aritmetiku s nebalenými celočíselnými typy. Kontrolované operátory zajišťují ověření výpočtů pro přetečení nebo podtečení, což zajišťuje bezpečnější aritmetické operace pro kritické aplikace.
Binární operátor | Poznámky |
---|---|
+ (sčítání, plus) |
Vyvolá OverflowException, pokud výsledek překročí maximální hodnotu nebo klesne pod minimální hodnotu podporovanou typem. Jsou možná jak přetečení , tak i podtečení . |
- (odčítání, minus) |
Vyvolá OverflowException, pokud výsledek překročí maximální hodnotu nebo klesne pod minimální hodnotu podporovanou typem. Jak Přetečení, tak Podtečení jsou možné. |
* (násobení, časy) |
Vyvolá OverflowException, pokud produkt překročí maximální hodnotu nebo klesne pod minimální hodnotu podporovanou typem. Jak přetečení, tak podtečení jsou možné. |
Kontrolované operátory jsou užitečné k zajištění toho, aby aritmetické přetečení byly zachyceny a zpracovány explicitně.
Tady je příklad:
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.
Volba mezi zaškrtnutými a nezaškrtnutými operátory
Překontrolované operátory: Ideální pro scénáře, kdy je potřeba rozpoznat a zpracovat chyby přetečení explicitně.
Nezaškrtnuté operátory: Ve výchozím nastavení jazyk F# z důvodů výkonu používá nezaškrtnuté aritmetické operátory. Tyto operace mohou tiše produkovat nesprávné výsledky při přetečení nebo podtečení. Používejte s opatrností.
Souhrn unárních aritmetických operátorů
Následující tabulka shrnuje unární aritmetické operátory, které jsou k dispozici pro celočíselné a reálné typy.
Unární operátor | Poznámky |
---|---|
+ (kladné) |
Lze použít u libovolného aritmetického výrazu. Nezmění znaménko hodnoty. |
- (negace, záporný) |
Lze použít u libovolného aritmetického výrazu. Změní znaménko hodnoty. |
Chování při přetečení nebo podtečení pro integrální typy je obtékat kolem. To způsobí nesprávný výsledek. Celočíselné přetečení je potenciálně závažný problém, který může vést k problémům se zabezpečením, pokud software není navržen tak, aby jej zohledňoval. Pokud se jedná o problém pro vaši aplikaci, zvažte použití ověřených operátorů v Microsoft.FSharp.Core.Operators.Checked
.
Souhrn binárních relačních operátorů
Následující tabulka ukazuje binární porovnávací operátory, které jsou k dispozici pro celočíselné a s plovoucí desetinnou čárkou. Tyto operátory vracejí hodnoty typu bool
.
Čísla s plovoucí desetinnou čárkou by nikdy neměla být přímo porovnávána pro rovnost, protože IEEE reprezentace s plovoucí desetinnou čárkou nepodporuje přesnou operaci porovnání stejných hodnot. Dvě čísla, která můžete snadno ověřit jako rovná kontrolou kódu, mohou mít ve skutečnosti různé bitové reprezentace.
Operátor | Poznámky |
---|---|
= (rovnost, rovná se) |
Toto není operátor přiřazení. Používá se pouze pro porovnání. Toto je obecný operátor. |
> (větší než) |
Toto je obecný operátor. |
< (menší než) |
Toto je obecný operátor. |
>= (větší než nebo rovno) |
Toto je obecný operátor. |
<= (menší než nebo rovno) |
Toto je obecný operátor. |
<> (nerovná se) |
Toto je obecný operátor. |
Přetížené a obecné operátory
Všechny operátory, které jsou popsány v tomto tématu, jsou definovány ve jmenném oboru Microsoft.FSharp.Core.Operators. Některé operátory jsou definovány pomocí staticky vyřešených parametrů typu. To znamená, že existují jednotlivé definice pro každý konkrétní typ, který funguje s tímto operátorem. Všechny unární a binární aritmetické a bitové operátory jsou v této kategorii. Relační operátory jsou obecné, a proto pracují s libovolným typem, nejen s primitivními aritmetickými typy. Diskriminované sjednocení a typy záznamů mají vlastní implementace, které jsou generovány kompilátorem jazyka F#. Typy tříd používají metodu Equals.
Obecné operátory jsou přizpůsobitelné. Pokud chcete přizpůsobit porovnávací funkce, přepište Equals tak, aby poskytovala vlastní porovnání rovnosti, a pak implementujte IComparable. Rozhraní System.IComparable má jednu metodu, CompareTo metodu.
Operátory a odvození typů
Použití operátoru ve výrazu omezuje odvození typu u tohoto operátoru. Použití operátorů také zabraňuje automatické generalizaci, protože použití operátorů znamená aritmetický typ. Bez jakýchkoli dalších informací kompilátor jazyka F# odvodí int
jako typ aritmetických výrazů. Toto chování můžete přepsat zadáním jiného typu. Proto jsou typy argumentů a návratový typ function1
v následujícím kódu odvozeny tak, aby byly int
, ale typy pro function2
jsou odvozeny tak, aby byly 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