Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema werden arithmetische Operatoren beschrieben, die in F# verfügbar sind.
Zusammenfassung der binären arithmetischen Operatoren
Arithmetische Vorgänge in F# können in zwei Modi ausgeführt werden: Deaktiviert und aktiviert. Standardmäßig verwenden arithmetische Vorgänge das deaktivierte Verhalten, das die Leistung priorisiert, aber überlauf/unterlauf ermöglicht. Überprüfte Operatoren priorisieren die Sicherheit, indem Ausnahmen in solchen Fällen ausgelöst werden.
Deaktivierte arithmetische Operatoren
In der folgenden Tabelle sind die binären arithmetischen Operatoren zusammengefasst, die für nicht aktivierte Arithmetik mit unboxierten integralen und Gleitkommatypen verfügbar sind.
| Binäroperator | Hinweise |
|---|---|
+ (Addition, Plus) |
Nicht aktiviert. Mögliche Überlaufbedingung, wenn Zahlen addiert werden und die Summe den maximal vom Typ unterstützten absoluten Wert überschreitet. |
- (Subtraktion, Minus) |
Nicht aktiviert. Mögliche Unterlaufbedingung, wenn nicht signierte Typen subtrahiert werden, oder wenn Gleitkommawerte zu klein sind, um vom Typ dargestellt zu werden. |
* (Multiplikation, Uhrzeit) |
Nicht aktiviert. Mögliche Überlaufbedingung, wenn Zahlen multipliziert werden und das Produkt den maximal vom Typ unterstützten Absolutenwert überschreitet. |
/ (Division, dividiert durch) |
Division durch Null verursacht einen DivideByZeroException integralen Typ. Bei Gleitkommatypen erhalten Sie durch Division durch Null die speziellen Gleitkommawerte infinity oder -infinity. Es gibt auch eine mögliche Unterlaufbedingung, wenn eine Gleitkommazahl zu klein ist, um durch den Typ dargestellt zu werden. |
% (rest, rem) |
Gibt den Rest eines Divisionsvorgangs zurück. Das Zeichen des Ergebnisses entspricht dem Zeichen des ersten Operanden. |
** (Exponentiation, an die Macht von) |
Mögliche Überlaufbedingung, wenn das Ergebnis den maximalen Absolutenwert für den Typ überschreitet. Der Exponentiationsoperator funktioniert nur mit Gleitkommatypen. |
Das deaktivierte Verhalten löst keine Ausnahmen aus, wenn Überlauf oder Unterlauf auftritt, wodurch es für arithmetische Groß- oder Edgefallwerte weniger sicher ist.
Aktivierte arithmetische Operatoren
In der folgenden Tabelle sind die binären arithmetischen Operatoren zusammengefasst, die für Aktivierte Arithmetik mit unboxierten Integraltypen verfügbar sind. Überprüfte Operatoren stellen sicher, dass Berechnungen für Überlauf oder Unterlauf überprüft werden, was eine sicherere Arithmetik für kritische Anwendungen bietet.
| Binäroperator | Hinweise |
|---|---|
+ (Addition, Plus) |
Löst ein OverflowException , wenn das Ergebnis den Maximalwert überschreitet oder den vom Typ unterstützten Minimalwert unterschreitet. Sowohl Overflow als auch Underflow sind möglich. |
- (Subtraktion, Minus) |
Löst ein OverflowException , wenn das Ergebnis den Maximalwert überschreitet oder den vom Typ unterstützten Minimalwert unterschreitet. Sowohl Overflow als auch Underflow sind möglich. |
* (Multiplikation, Uhrzeit) |
Löst ein OverflowException , wenn das Produkt den Maximalwert überschreitet oder den vom Typ unterstützten Minimalwert unterschreitet. Sowohl Overflow als auch Underflow sind möglich. |
Die überprüften Operatoren sind nützlich, um sicherzustellen, dass arithmetische Überläufe explizit abgefangen und behandelt werden.
Hier ist ein Beispiel angegeben:
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.
Auswählen zwischen aktivierten und deaktivierten Operatoren
Aktivierte Operatoren: Ideal für Szenarien, in denen Überlauffehler erkannt und explizit behandelt werden müssen.
Deaktivierte Operatoren: Standardmäßig verwendet F# aus Leistungsgründen nicht aktivierte Arithmetik. Diese Vorgänge können beim Überlauf oder Unterlauf im Hintergrund falsche Ergebnisse erzeugen. Verwenden Sie sie mit Vorsicht.
Zusammenfassung von unären arithmetischen Operatoren
In der folgenden Tabelle sind die unären arithmetischen Operatoren zusammengefasst, die für integrale und Gleitkommatypen verfügbar sind.
| Unärer Operator | Hinweise |
|---|---|
+ (positiv) |
Kann auf einen beliebigen arithmetischen Ausdruck angewendet werden. Ändert das Vorzeichen des Werts nicht. |
- (Negation, negativ) |
Kann auf einen beliebigen arithmetischen Ausdruck angewendet werden. Ändert das Vorzeichen des Werts. |
Das Verhalten bei Überlauf oder Unterlauf für integrale Typen ist das Umbrechen. Dies führt zu einem falschen Ergebnis. Ganzzahlüberlauf ist ein potenziell schwerwiegendes Problem, das zu Sicherheitsproblemen beitragen kann, wenn Software nicht geschrieben wird, um sie zu berücksichtigen. Wenn dies ein Problem für Ihre Anwendung ist, erwägen Sie die Verwendung der eingecheckten Operatoren in Microsoft.FSharp.Core.Operators.Checked.
Zusammenfassung der Binären Vergleichsoperatoren
Die folgende Tabelle zeigt die binären Vergleichsoperatoren, die für integrale und Gleitkommatypen verfügbar sind. Diese Operatoren geben Werte vom Typ boolzurück.
Gleitkommazahlen sollten niemals direkt mit Gleichheit verglichen werden, da die IEEE-Gleitkommadarstellung keinen exakten Gleichheitsvorgang unterstützt. Zwei Zahlen, die Sie leicht überprüfen können, um gleich zu sein, indem Sie den Code überprüfen, kann tatsächlich unterschiedliche Bitdarstellungen aufweisen.
| Bediener | Hinweise |
|---|---|
= (Gleichheit, gleich) |
Dies ist kein Zuordnungsoperator. Sie wird nur zum Vergleich verwendet. Dies ist ein generischer Operator. |
> (größer als) |
Dies ist ein generischer Operator. |
< (kleiner als) |
Dies ist ein generischer Operator. |
>= (größer oder gleich) |
Dies ist ein generischer Operator. |
<= (kleiner oder gleich) |
Dies ist ein generischer Operator. |
<> (nicht gleich) |
Dies ist ein generischer Operator. |
Überladene und generische Operatoren
Alle in diesem Thema erläuterten Operatoren werden im Namespace "Microsoft.FSharp.Core.Operators " definiert. Einige der Operatoren werden mithilfe von statisch aufgelösten Typparametern definiert. Dies bedeutet, dass für jeden bestimmten Typ, der mit diesem Operator funktioniert, einzelne Definitionen vorhanden sind. Alle unär- und binären arithmetischen und bitweisen Operatoren befinden sich in dieser Kategorie. Die Vergleichsoperatoren sind generisch und funktionieren daher mit jedem Typ, nicht nur mit primitiven arithmetischen Typen. Diskriminierte Union- und Datensatztypen verfügen über eigene benutzerdefinierte Implementierungen, die vom F#-Compiler generiert werden. Klassentypen verwenden die Methode Equals.
Die generischen Operatoren können angepasst werden. Um die Vergleichsfunktionen anzupassen, überschreiben Equals Sie diese, um einen eigenen Vergleich der benutzerdefinierten Gleichheit bereitzustellen, und implementieren Sie IComparabledann . Die System.IComparable Schnittstelle verfügt über eine einzelne Methode, die CompareTo Methode.
Operatoren und Typinference
Die Verwendung eines Operators in einem Ausdruck schränkt die Typausleitung für diesen Operator ein. Außerdem verhindert die Verwendung von Operatoren die automatische Generalisierung, da die Verwendung von Operatoren einen arithmetischen Typ impliziert. Wenn keine weiteren Informationen vorhanden sind, leitet int der F#-Compiler als Typ von arithmetischen Ausdrücken ab. Sie können dieses Verhalten überschreiben, indem Sie einen anderen Typ angeben. Daher werden die Argumenttypen und der Rückgabetyp function1 im folgenden Code abgeleitet int, aber die Typen function2 für diese werden abgeleitet 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