2011-01-19 10 views
3

私は私のジオメトリアルゴリズムに供給するためのテストケースを構築するためにそれを使用することができるように私は、私は、アプリケーションをデバッグしていたときに完全にdouble値を抽出したいの。どのようにデバッガまたはコンソール内のすべての小数点以下の桁数と出力ダブルバリュー

は、どのようにC#でdoubleデータ型で許可された非常に最後の小数点以下までdouble値をout--抽出する - とデバッガウィンドウのいずれかで出力すること、またはConsole.WriteLineコマンドを使用していますか?

編集:私の問題は、私は右の非常に最後の桁まで、入力の全二重の価値を主張すれば、入力として二重の値をとるアルゴリズムは唯一の失敗するということです。そして私はテストケースでそれを再現したいので、それで二重価値のような完全な表現が必要なのです。

+0

あなたは 'Console.WriteLine'を使用する場合はどうなりますか? –

+0

@Drackir、小数点以下30桁以上があるにもかかわらず、テストケースでは小数点以下10桁までしか表示されません。 – Graviton

答えて

1

大量の小数点以下の桁数に10進数として2進数を出力し、正確な比較を行う代わりに、許容誤差であるε値との比較を行い、εを非常に小さく設定します。例えば。

double epsilon = Math.Abs(actual - expected); 
Assert.That(epsilon, Is.LessThan(0.000000000001); 
+0

多くのアプリケーションで、あなたが提案するものが最適です。私はOPと同じボートにいる。私はまれなケースのために無限ループに入る数値アルゴリズムを持っています。問題がポップアップすると、私はデバッガを停止し、入力パラメータを調べます。しかし、これらの値を使ってNUnitのケースを作ると、無限にループしません。 VSは結果を丸め、丸められた値は問題を示さない。 –

2

私はそれの音で、あなたが望む正確何を行いDoubleConverter classを持っています。このようにそれを使用します。

string text = DoubleConverter.ToExactString(doubleValue); 

あなたは、出力はそれがはるかに精度ことを持っているという意味ではありません桁の大きな数を、持っているという理由だけであることを理解しておいてくださいする必要があります。詳細はbinary floating point in .NETで私の記事を読んでみてください。もちろん、このすべてを最初から理解しているかもしれません。あなただけのラウンドトリップすることができ、文字列値をしたい場合、あなたは余分なコードを必要としないこと

注 - ちょうど「R」書式指定子を使用します。私はジャクソン教皇のに同意

string text = doubleValue.ToString("r"); 

をテストのための等価比較での許容誤差を使用する一般的なアプローチですが、ダブルで表される正確な値を表示することは時々役に立ちます。なぜ特定の計算が何らかの形で出てきたのかを理解しやすくなります。

+0

私はC#で処理できないことに本当に驚いています。私たちはそれを処理するために独自のクラスを書くことに頼る必要があります。 – Graviton

+0

@Graviton:まあC#ではこれについてあまり詳しく述べていませんが、.NETライブラリにはもっと悩まされます。そして、それは*一般的な要件ではありません - 通常、利用可能な精度を超えた正確な値ではなく、一般的な大きさに興味を持っているべきであるからです。 –

+0

私はあなたのコードをテストしました。 「、そして私が得た文字列は ' "23445.43644875676909578032791614532470703125"'である; Console.WriteLineを(テキスト);文字列text = DoubleConverter.ToExactString(AAT); 'ダブルAAT = 23445.4364487567676445433642536544656:ここに私のテストコードです。彼らは同じではありません。 – Graviton

関連する問題