C#の浮動小数点比較関数
2023-08-26 17:51:48
質問
誰かC#で浮動小数点値を比較するための良い一般的な浮動小数点比較関数を指し示す(または示す)ことができますか?私は
IsEqual
,
IsGreater
アン
IsLess
. また、私は浮動小数点数ではなく、倍数のみを本当に気にします。
どのように解決するのですか?
便利な汎用浮動小数点の書き方
IsEqual
を書くことは、完全に不可能ではないにしても、とてもとても難しいことです。現在のコードでは
a==0
. このような場合にメソッドがどのように動作すべきかは、実際には定義の問題であり、間違いなく、コードは特定のドメインのユースケースに合わせて調整されるのが最善でしょう。
この種のものに対して、あなたは が本当に、本当に必要です。 が必要です。これは、私が 浮動小数点演算ガイド のために行った方法で、これが最終的に私が考え出したものです(Javaコード、翻訳するのは十分に簡単でしょう)。
public static boolean nearlyEqual(float a, float b, float epsilon) {
final float absA = Math.abs(a);
final float absB = Math.abs(b);
final float diff = Math.abs(a - b);
if (a == b) { // shortcut, handles infinities
return true;
} else if (a == 0 || b == 0 || absA + absB < Float.MIN_NORMAL) {
// a or b is zero or both are extremely close to it
// relative error is less meaningful here
return diff < (epsilon * Float.MIN_NORMAL);
} else { // use relative error
return diff / (absA + absB) < epsilon;
}
}
また のテストスイートもあります。 .
付録です。 倍数のためのc#の同じコード(質問で尋ねられたように)
public static bool NearlyEqual(double a, double b, double epsilon)
{
const double MinNormal = 2.2250738585072014E-308d;
double absA = Math.Abs(a);
double absB = Math.Abs(b);
double diff = Math.Abs(a - b);
if (a.Equals(b))
{ // shortcut, handles infinities
return true;
}
else if (a == 0 || b == 0 || absA + absB < MinNormal)
{
// a or b is zero or both are extremely close to it
// relative error is less meaningful here
return diff < (epsilon * MinNormal);
}
else
{ // use relative error
return diff / (absA + absB) < epsilon;
}
}
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] URLのPath.Combineは?
-
[解決済み] 除算を強制的に浮動小数点にするにはどうしたらいいですか?除算は0に切り捨てられ続けますか?
-
[解決済み] JavaScriptで浮動小数点数の精度を扱うには?
-
[解決済み】浮動小数点値の比較はどのくらい危険か?
-
[解決済み】float < integerの比較で4倍遅くなるものがあるのはなぜですか?
-
[解決済み] C#で浮動小数点演算は整合性が取れているのか?可能なのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】C#で四捨五入する方法
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] 関数を終了するには?
-
[解決済み】WebResource.axdとは何ですか?