このトピックでは、F# で使用できる算術演算子について説明します。
二項算術演算子の概要
F# の算術演算は、 オフ と チェックの 2 つのモードで実行できます。 既定では、算術演算ではオフの動作が使用されます。これにより、パフォーマンスが優先されますが、オーバーフロー/アンダーフローが許可されます。 チェックされた演算子は、このような場合に例外をスローすることで安全性を優先します。
オフの算術演算子
次の表は、ボックス化されていない整数型と浮動小数点型を持つ Unchecked Arithmetic で使用できる 2 項算術演算子をまとめたものです。
二項演算子 | 注記 |
---|---|
+ (加算、プラス) |
チェック解除済み。 数値が加算され、合計が型でサポートされている最大値を超えると、オーバーフロー状態が発生する可能性があります。 |
- (減算、マイナス) |
チェック解除済み。 符号なし型が減算される場合、または浮動小数点値が小さすぎて型で表現できない場合に、アンダーフロー条件が発生する可能性があります。 |
* (乗算、時間) |
チェック解除済み。 数値が乗算され、製品が型でサポートされている最大絶対値を超えた場合に、オーバーフロー状態が発生する可能性があります。 |
/ (除算、除算) |
0 で除算すると、整数型の DivideByZeroException が発生します。 浮動小数点型の場合、0 で除算すると、特殊な浮動小数点値が infinity または -infinity されます。 浮動小数点数が小さすぎて型で表現できない場合は、アンダーフロー条件が発生する可能性もあります。 |
% (剰余、rem) |
除算演算の残りの部分を返します。 結果の符号は、最初のオペランドの符号と同じです。 |
** (指数、べき乗) |
結果が型の絶対値の最大値を超えた場合に発生する可能性のあるオーバーフロー条件。 指数演算子は、浮動小数点型でのみ機能します。 |
オフの動作では、オーバーフローまたはアンダーフローが発生しても例外がスローされないため、大きな値またはエッジケース値の算術演算の安全性が低下します。
Checked 算術演算子
次の表は、 チェック された算術演算で使用できる二項算術演算子と、ボックス化されていない整数型をまとめたものです。 チェックされた演算子により、オーバーフローまたはアンダーフローの計算が検証され、重要なアプリケーションに対してより安全な算術演算が提供されます。
二項演算子 | 注記 |
---|---|
+ (加算、プラス) |
結果が最大値を超えた場合、または型でサポートされている最小値を下回った場合に、 OverflowException をスローします。 オーバーフローとアンダーフローの両方が可能です。 |
- (減算、マイナス) |
結果が最大値を超えた場合、または型でサポートされている最小値を下回った場合に、 OverflowException をスローします。 オーバーフローとアンダーフローの両方が可能です。 |
* (乗算、時間) |
製品が最大値を超えた場合、または型でサポートされている最小値を下回った場合に、 OverflowException をスローします。 オーバーフローとアンダーフローの両方が可能です。 |
チェックされた演算子は、算術オーバーフローがキャッチされ、明示的に処理されるようにするのに役立ちます。
次に例を示します。
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.
チェックされた演算子とオフになっている演算子の選択
Checked 演算子: オーバーフロー エラーを検出して明示的に処理する必要があるシナリオに最適です。
オフの演算子: 既定では、F# はパフォーマンス上の理由からオフの算術演算を使用します。 これらの操作では、オーバーフローまたはアンダーフローが発生すると、自動的に正しくない結果が生成される可能性があります。 慎重に使用してください。
単項算術演算子の概要
次の表は、整数型と浮動小数点型で使用できる単項算術演算子をまとめたものです。
単項演算子 | 注記 |
---|---|
+ (正) |
任意の算術式に適用できます。 値の符号を変更しません。 |
- (否定、負) |
任意の算術式に適用できます。 値の符号を変更します。 |
整数型のオーバーフローまたはアンダーフローでの動作は、ラップすることです。 これにより、正しくない結果が発生します。 整数オーバーフローは、ソフトウェアがそれに対応するように書き込まれていない場合にセキュリティの問題に寄与する可能性のある重大な問題です。 これがアプリケーションに問題がある場合は、 Microsoft.FSharp.Core.Operators.Checked
でチェックされた演算子を使用することを検討してください。
二項比較演算子の概要
次の表は、整数型と浮動小数点型で使用できる 2 項比較演算子を示しています。 これらの演算子は、 bool
型の値を返します。
IEEE 浮動小数点表現では正確な等値演算がサポートされていないため、浮動小数点数を等しいかどうかを直接比較しないでください。 コードを調べることで同じであることを簡単に確認できる 2 つの数値は、実際には異なるビット表現を持つ可能性があります。
オペレーター | 注記 |
---|---|
= (等値、等しい) |
これは代入演算子ではありません。 比較にのみ使用されます。 これはジェネリック演算子です。 |
> (より大きい) |
これはジェネリック演算子です。 |
< (より小さい) |
これはジェネリック演算子です。 |
>= (以上) |
これはジェネリック演算子です。 |
<= (以下) |
これはジェネリック演算子です。 |
<> (等しくない) |
これはジェネリック演算子です。 |
オーバーロードされた演算子とジェネリック演算子
このトピックで説明するすべての演算子は、 Microsoft.FSharp.Core.Operators 名前空間で定義されています。 一部の演算子は、静的に解決された型パラメーターを使用して定義されます。 これは、その演算子で動作する特定の型ごとに個別の定義があることを意味します。 単項演算子と 2 項算術演算子とビット演算子はすべて、このカテゴリに含まれています。 比較演算子はジェネリックであるため、プリミティブ算術型だけでなく、任意の型で動作します。 判別共用体とレコード型には、F# コンパイラによって生成される独自のカスタム実装があります。 クラス型は、 Equalsメソッドを使用します。
ジェネリック演算子はカスタマイズ可能です。 比較関数をカスタマイズするには、 Equals をオーバーライドして独自のカスタム等価比較を提供し、 IComparableを実装します。 System.IComparable インターフェイスには、CompareTo メソッドという 1 つのメソッドがあります。
演算子と型推論
式で演算子を使用すると、その演算子の型推論が制限されます。 また、演算子の使用は算術型を意味するため、演算子を使用すると自動一般化が行われません。 他の情報がない場合、F# コンパイラは int
を算術式の型として推論します。 別の型を指定することで、この動作をオーバーライドできます。 したがって、次のコードの function1
の引数型と戻り値の型は int
と推定されますが、 function2
の型は 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
こちらも参照ください
- シンボルと演算子のリファレンス
- 演算子のオーバーロード
- ビット演算子 の
- ブール演算子
.NET