17

ステートメントを考えると

float f = 7.1f;
double d = f;

d に関する単体テストで何をアサートできますか?


たとえば、これは機能しません。

Console.WriteLine(d == 7.1d); // false
Console.WriteLine(d < 7.1d + float.Epsilon); // true by luck
Console.WriteLine(d > 7.1d - float.Epsilon); // false (less luck)

これまでに見つけた最良の方法は、値を元に戻すことです。

float f2 = (float)d;
Console.WriteLine(f2 == f); // true

これは荒々しい言い方と同じだろう

Console.WriteLine(d == 7.1f); // 7.1f implicitly converted to double as above

この質問は、一般的に倍精度と浮動小数点の精度に関するものではなく、実際には、単体テストが d の範囲をどのように最もよく説明できるかという実用的な質問に関するものです。私の場合、d は、軽量コード生成によって生成されたコードで発生する変換の結果です。このコード生成をテストしている間、私はこの関数の結果についてアサーションを行う必要があり、これは最終的に上記の単純な質問に要約されます。

4

3 に答える 3

4

あなたの「最善の方法」は、生成されたコードがfloatエラーの範囲内である何かを返すと主張すること7.1です. これはあなたが確認したいことかもしれません。その場合は続けてください。

一方、生成されたコードが特に7.1fへのキャストの結果を返すことをアサートしたいdouble場合があります。その場合、次のようにすることができます。

Console.WriteLine(d == (double)f);

これはより厳密です。テストdは小さな範囲内にあると主張しますが、上記のテストはそれdが特定の値であると主張します。

それは本当にあなたが何dのために使うかによって異なります。正確な値でないと問題が発生する場合は、正確な値をテストしますがfloat、値の範囲内で問題ない場合は、float.

于 2012-12-19T13:02:23.220 に答える
1

ibmがテストするために提案する2つの浮動小数点値を比較するにはabs(a/b - 1) < epsilon

msndはEpsilon、インスタンスの値がゼロの場合に、プロパティが数値演算または比較で重要な最小の正の値を反映していることを示します。

だから実際にチェックする必要があります

Math.Abs(d/(double)f) - 1) < float.Epsilon)
于 2012-12-19T13:17:57.547 に答える
1

(float) d == f

別の答えが提案されましたが、暗黙的に実行するのと同じ変換を実行するd == (double) fため、これは役に立たないテストです。したがって、このアサーションがテストできる唯一のことは、実装の一部が壊れているかどうか(たとえば、コンパイラが変換の1つを誤って、他とは異なる方法で実装したかどうか)、外部メカニズムが変更されたか、割り当てとアサーションの間であるかどうかです。 、またはソースコードが壊れていたため、の値を正確に保持できるタイプも、割り当ても実行されませんでした。(double) fd = fdfddoublefloatfd = f

一般に、浮動小数点のエラーは発生しないと予想されます。これは、浮動小数点の通常の実装では、同じ基数の狭い精度から広い精度に変換してもエラーが発生しないためです。広い精度はすべての値を表すことができるため、狭い精度は。まれな状況では、浮動小数点形式が広いほど指数範囲が狭くなる場合があります。この場合、または逆に定義された浮動小数点形式でのみ、より広い形式に変換すると値が変化する可能性があります。このような場合、同じ変換を実行しても変更は検出されません。

代わりに、幅の広い形式から幅の狭い形式に変換し直します。dと異なる場合f、この変換はエラーを検出する可能性があります。たとえば、f0x1p-1000が含まれていると仮定しますが、何らかの理由で、の形式では表現できないため、dゼロに丸められました。次に、(float) d == fに評価され(float) 0 == 0x1p-1000、次にに評価され、次にに評価さ0 == 0x1p-1000falseます。さらに、このテストでは、他の提案と同じエラーが検出される場合があります。実装の破損、dまたはの変更f、のタイプの誤りd、およびの割り当ての欠落ですd = f

それ以外に、ここでアサーションを使用してどのようなエラーを検出しようとしていますか?

于 2012-12-19T14:33:00.450 に答える