Jason Hickey の Introduction to Objective Caml を学んでいます。
それは言う
Matching against floating-point values is supported, but it is rarely used because of numerical issues
わかりました、浮動小数点値を一致させることはできません。
では、必要な場合はどうすればよいでしょうか。それをどうするか?
Jason Hickey の Introduction to Objective Caml を学んでいます。
それは言う
Matching against floating-point values is supported, but it is rarely used because of numerical issues
わかりました、浮動小数点値を一致させることはできません。
では、必要な場合はどうすればよいでしょうか。それをどうするか?
浮動小数点数を一致させることができますが、めったに使用されないと言っているだけです。
精度の問題が発生する可能性があるため、めったに使用されません。x と y の 2 つの数値がある場合:
x = 0.000000001
y = 0.0000000009
x と y は同じですか? まあ、それは依存します。x と y が計算の結果である場合、累積された丸めによって違いが説明でき、それらは同じである可能性があります。
より大まかに言えば、浮動小数点比較はしばしば「十分に近い」ため、完全一致としてパターン マッチングでほとんど使用されない理由は、しばしば必要とされる「十分に近い」一致を除外できるからです。
代数データ型 ( などSome 3: int option
) を扱う場合、実際にはパターン マッチングが必要です。これは、含まれている値を取得するための基本的な OCaml 機能です。数値などのプリミティブ値を扱う場合、パターン マッチングは便利な表記法です。通常の関係演算子 (およびif
ステートメント) を使用できます。これは、通常、浮動小数点値に使用するものです。他の人が言ったように、パターン ガードを使用することもできますが、これはほとんど別の形式のif
ステートメントです。
以前の回答を拡張するには、次の例のようにフロートでパターン マッチングを使用できます。
# let float_match_example = function
| 0. -> "exact zero"
| x when abs_float x < 1e-12 -> "epsilon"
| _ -> "other";;
val float_match_example : float -> string = <fun>
# List.map float_match_example [0.; 42e-15; 3.];;
- : string list = ["exact zero"; "epsilon"; "other"]
パターン マッチングが暗黙的に等価性テストを使用することに注意してください。これは、float を操作するときに必要になることはめったにありません。丸め誤差が累積すると、2 つの float が完全に等しくなることはめったにありません。したがって、上記のコードに示されているように、キーワードでガードを使用できます。when
ヘルパー関数を使用してパターン ガードを記述して、等価性、イプシロン、またはその他の基準をチェックすることができます。