2011-12-15 128 views
4

我有一個用Microsoft Visual C++ 6.0編寫的應用程序。現在我已經使用C#重寫了Visual Studio 2010中的應用程序,但由於精度問題導致結果不匹配。其中一個精確問題是以下問題之一。Visual Studio 2010的精確問題

float a = 1.0f; 

float b = 3.0f; 

float c = a/b; 

這是當在Visual Studio 2010運行C#代碼給出c值= 0.333333343

但同樣的代碼,在值的定義,當上運行值之後去除˚F的Visual C++ 6.0給出C值= 0.333333

任何人都可以對它進行排序並解釋如何在visual Studio以及Visual C++ 6.0中爲c賦予相同的值?


實際上這些值取自監視窗口。我開始知道不同版本的Visual Studio在浮點格式表示上可能會有所不同。因此,手錶中的值可能沒有用處。這就是爲什麼我在兩個visual studio版本中都打印了值的原因,結果如下所示。 與Visual Studio 6.0使用Visual C++語言是0.333333(6個3的)

但使用C#語言的Visual Studio 10是0.3333333(7個3的)

所以任何人可以幫助我,使我的C#程序產生與Visual C++相同的結果? (即我怎樣才能使浮動操作產生相同的結果在這兩個版本?)

+2

您是如何看待這些值的?我很確定內部表示是相同的(除非我錯了,C#在後臺使用`double'),但向用戶顯示數字的方法不同,因此您可以簡單地查看不同的顯示默認值。 – 2011-12-15 12:37:06

+0

@MrLister C#4.0規範在第4.1.6節中說,浮點數上的二進制運算「使用*至少* float類型和精度」(強調增加)來執行。所以幕後精度是由實現定義的。 .NET Framework可能在幕後使用雙打。 – phoog 2011-12-28 18:29:26

回答

15

鑑於確切的價值是0.3重複,他們都沒有「正確」 - 如果你試圖匹配確切二進制浮點計算的結果,這通常是一個壞主意,由於他們的工作方式。 (請參閱我的文章binary floating point in .NET一些更多的信息。)

這是可能,你不應該使用在第一位二進制浮點來(例如,如果你的價值觀代表確切,人工數額如金錢)。或者,您可能只應該使用特定容差進行平等比較。

有可能是C#和C生產完全相同的位模式 - 但你看到的,因爲如何將這些價值觀正在格式化不同的結果。再次,我不會使用數字的文本表示進行比較。

5

C#只顯示較少的小數位。 0.333333343四捨五入爲有效數字爲0.333333c的基礎值是相同的。

當然,如果你想要更高的精度,你總是可以使用double變量。

3

C#浮點可以通過floatdouble類型來處理。 A float類型有7位數的精度和double 16.

我相信C++標準精度約爲16位數(平均15.9!)。

在任何情況下,由於1/3是0.333重複,因此這兩種表示都不是算術上正確的。

我認爲它只是您看到的值的表示(請注意,調試器會將該值轉換爲顯示的字符串,如果您檢查每個存儲器的位置,您可能會發現值

1

快速檢查顯示是的,數字是完全一樣的。所以你的問題的答案是,當你想要相同的輸出,你所需要做的就是確保顯示方法兼容。
例如,C中的printf("%9.7f", result)和C#中的string.Format("{0:0.0000000}", result)。就這樣。