爲什麼此代碼在.NET 4中打印False
?看起來一些意想不到的行爲是由顯式演員造成的。將結果投入浮動返回float的結果更改結果
我想要一個超出「浮點數不準確」或「不這樣做」的答案。
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 2012-01-09 21:42:28
另一個有用的鏈接:http://msdn.microsoft.com/en-us/library/ms187912.aspx – David 2012-01-09 21:45:53
儘管如此,這是一個有趣的問題。在功能上,人們會期望這些方法A和B執行相同的操作,即使使用浮點近似。我有興趣聽到解釋。 – 2012-01-09 21:45:58