Teilen über


Arithmetische Operatoren

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

Siehe auch