Sdílet prostřednictvím


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

Viz také