なぜこのコードは.NET 4にFalse
を出力しますか?明示的なキャストによって予期しない動作が発生しているようです。浮動小数点型の結果を返すメソッドで結果をキャストすると結果が変化する
「浮動小数点は不正確です」または「しないでください」を超える回答が必要です。
float a(float x, float y)
{
return (x * y);
}
float b(float x, float y)
{
return (float)(x * y);
}
void Main()
{
Console.WriteLine(a(10f, 1f/10f) == b(10f, 1f/10f));
}
PS:このコードはリリースコードではなくユニットテストから来たものです。コードは意図的にこのように書かれました。私はそれが最終的に失敗するだろうと思ったが、正確かつ正確な理由を正確に知りたかった。答えは、浮動小数点決定論の通常の理解を超えた理解を提供するため、この技法の妥当性を証明します。そして、それがこのコードをこのように書いた点です。意図的な探査。
PPS:ユニットテストは、.NET 3.5で渡しましたが、現在は.NET 4.
浮動小数点変数は、定義上、100%正確ではありません。彼らはおおよその数字です。 http://msdn.microsoft.com/en-us/library/b1e65aza.aspxこの記事も参照してください。http://stackoverflow.com/questions/618535/what-is-the-difference-between-decimal-float -and-double-in-c ランタイムの*いずれの*風味でも同じであるという保証はありません。 – David
さらに役に立つリンク:http://msdn.microsoft.com/en-us/library/ms187912.aspx – David
それにもかかわらず、興味深い質問です。機能的には、浮動小数点近似を使用しても、これらのメソッドAとBが同じ操作を実行することが期待されます。私は説明を聞くことに興味がある。 –