Rekenkundige operatoren
In dit onderwerp worden rekenkundige operators beschreven die beschikbaar zijn in F#.
Samenvatting van binaire rekenkundige operatoren
Rekenkundige bewerkingen in F# kunnen in twee modi worden uitgevoerd: Ongecontroleerd en Gecontroleerd. Rekenkundige bewerkingen maken standaard gebruik van niet-gecontroleerd gedrag, dat prioriteit geeft aan prestaties, maar wel overloop/onderloop toestaat. Gecontroleerde operators geven prioriteit aan veiligheid door in zulke gevallen uitzonderingen op te werpen.
Ongecontroleerde rekenkundige operatoren
De volgende tabel bevat een overzicht van de binaire rekenkundige operatoren die beschikbaar zijn voor Niet-geverifieerde rekenkundige met unboxed gehele en drijvende-komma types.
Binaire operator | Notities |
---|---|
+ (optellen, plus) |
Ongecontroleerd. Mogelijke overloopvoorwaarde wanneer getallen worden opgeteld en de som de maximum absolute waarde overschrijdt die door het type wordt ondersteund. |
- (aftrekken, minteken) |
Uitgevinkt. Mogelijke onderloopvoorwaarde wanneer niet-ondertekende typen worden afgetrokken of wanneer waarden met drijvende komma te klein zijn om door het type te worden weergegeven. |
* (vermenigvuldiging, tijden) |
Uitgevinkt. Mogelijke overloopvoorwaarde wanneer getallen worden vermenigvuldigd en het product de maximum absolute waarde overschrijdt die door het type wordt ondersteund. |
/ (delen, gedeeld door) |
Delen door nul veroorzaakt een DivideByZeroException voor integrale typen. Voor drijvende-komma-type geeft delen door nul je de speciale drijvende-kommawaarden infinity of -infinity . Er is ook een mogelijke onderloopvoorwaarde wanneer een drijvendekommagetal te klein is om te worden vertegenwoordigd door het type. |
% (rest, rem) |
Retourneert de rest van een delingsbewerking. Het teken van het resultaat is hetzelfde als het teken van de eerste operand. |
** (exponentiatie, tot de macht van) |
Mogelijke overloopvoorwaarde wanneer het resultaat de maximum absolute waarde voor het type overschrijdt. De exponentiatieoperator werkt alleen met typen voor getallen met drijvende komma. |
Het ongecontroleerde gedrag genereert geen uitzonderingen bij overloop of onderloop, waardoor het minder veilig is voor het uitvoeren van berekeningen op grote waarden of grensgevallen.
Gecontroleerde rekenkundige operatoren
De volgende tabel bevat een overzicht van de binaire rekenkundige operatoren die beschikbaar zijn voor gecontroleerde rekenkunde met niet-verpakte integrale typen. Gecontroleerde operators zorgen ervoor dat berekeningen worden geverifieerd voor overloop of onderloop, wat veiliger rekenkundige gegevens biedt voor kritieke toepassingen.
Binaire operator | Notities |
---|---|
+ (optellen, plus) |
Genereert een OverflowException als het resultaat de maximumwaarde overschrijdt of onder de minimumwaarde komt die door het type wordt ondersteund. Zowel Overflow als Underflow zijn mogelijk. |
- (aftrekken, minteken) |
Genereert een OverflowException als het resultaat de maximumwaarde overschrijdt of onder de minimumwaarde komt die door het type wordt ondersteund. Zowel Overflow als Underflow zijn mogelijk. |
* (vermenigvuldiging, tijden) |
Genereert een OverflowException als het product de maximumwaarde overschrijdt of onder de minimumwaarde komt die door het type wordt ondersteund. Zowel Overflow als Underflow zijn mogelijk. |
De gecontroleerde operatoren zijn handig om ervoor te zorgen dat rekenkundige overloop wordt gevangen en expliciet worden verwerkt.
Hier volgt een voorbeeld:
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.
Kiezen tussen ingeschakelde en uitgeschakelde operators
Gecontroleerde operators: Ideaal voor scenario's waarin overloopfouten expliciet moeten worden gedetecteerd en afgehandeld.
Niet-gecontroleerde operators: Standaard gebruikt F# niet-gecontroleerde rekenkundige bewerkingen om prestatieredenen. Deze bewerkingen kunnen op de achtergrond onjuiste resultaten opleveren wanneer overloop of onderloop plaatsvindt. Wees voorzichtig.
Samenvatting van Unaire Rekenkundige Operatoren
De volgende tabel bevat een overzicht van de unaire rekenkundige operatoren die beschikbaar zijn voor integrale en drijvende kommatypen.
Unaire operator | Notities |
---|---|
+ (positief) |
Kan worden toegepast op elke rekenkundige expressie. Wijzigt het teken van de waarde niet. |
- (negatie, negatief) |
Kan worden toegepast op elke rekenkundige expressie. Hiermee wijzigt u het teken van de waarde. |
Het gedrag bij overloop of onderloop voor integrale typen is om rond te lopen. Dit veroorzaakt een onjuist resultaat. Overloop van gehele getallen is een mogelijk ernstig probleem dat kan bijdragen aan beveiligingsproblemen wanneer software hiervoor niet is geschreven. Als dit een probleem is voor uw toepassing, kunt u overwegen om de gecontroleerde operators in Microsoft.FSharp.Core.Operators.Checked
te gebruiken.
Samenvatting van binaire vergelijkingsoperators
In de volgende tabel ziet u de binaire vergelijkingsoperatoren die beschikbaar zijn voor integrale en drijvende kommatypen. Deze operators retourneren waarden van het type bool
.
Getallen met drijvende komma mogen nooit rechtstreeks worden vergeleken voor gelijkheid, omdat de IEEE-drijvendekommage-representatie geen exacte gelijkheidsbewerking ondersteunt. Twee getallen die u eenvoudig kunt verifiëren om gelijk te zijn door de code te controleren, hebben mogelijk verschillende bitweergaven.
Bediener | Notities |
---|---|
= (gelijkheid, gelijk aan) |
Dit is geen toewijzingsoperator. Deze wordt alleen gebruikt voor vergelijking. Dit is een algemene operator. |
> (groter dan) |
Dit is een algemene operator. |
< (kleiner dan) |
Dit is een algemene operator. |
>= (groter dan of gelijk aan) |
Dit is een algemene operator. |
<= (kleiner dan of gelijk aan) |
Dit is een algemene operator. |
<> (niet gelijk aan) |
Dit is een algemene operator. |
Overbelaste en algemene operators
Alle operators die in dit onderwerp worden besproken, worden gedefinieerd in de Microsoft.FSharp.Core.Operators naamruimte. Sommige operators worden gedefinieerd met behulp van statisch opgeloste typeparameters. Dit betekent dat er afzonderlijke definities zijn voor elk specifiek type dat met die operator werkt. Alle unaire en binaire rekenkundige en bitgewijze operatoren bevinden zich in deze categorie. De vergelijkingsoperatoren zijn algemeen en werken daarom met elk type, niet alleen primitieve rekenkundige typen. Gediscrimineerde samenvoeg- en recordtypen hebben hun eigen aangepaste implementaties die worden gegenereerd door de F#-compiler. Klassetypen gebruiken de methode Equals.
De algemene operators kunnen worden aangepast. Als u de vergelijkingsfuncties wilt aanpassen, overschrijft u Equals om uw eigen aangepaste gelijkheidsvergelijking te bieden en implementeert u vervolgens IComparable. De System.IComparable-interface heeft één methode, de CompareTo methode.
Operators en type-inferentie
Het gebruik van een operator in een expressie beperkt de type-inferentie voor die operator. Bovendien voorkomt het gebruik van operators automatische generalisatie, omdat het gebruik van operators een rekenkundig type impliceert. Bij afwezigheid van andere informatie, leidt de F#-compiler int
af als het type voor rekenkundige uitdrukkingen. U kunt dit gedrag overschrijven door een ander type op te geven. De argumenttypen en het retourtype van function1
in de volgende code worden dus afgeleid als int
, maar de typen voor function2
worden afgeleid 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