2015-09-27 77 views
3

我對IEEE 754有一個相當不錯的理解,所以這不是那些「爲什麼要將數字a和數字b加在一起......」 - 這類問題。定點數字格式說明符舍入雙精度?

而是我想問如果我理解正確的定點數字格式說明符,因爲它不表現爲我所期望的一些雙重價值。

例如:

double d = 0x3FffffFFFFfffe * (1.0/0x3FffffFFFFffff); 
Console.WriteLine(d.ToString("R")); 
Console.WriteLine(d.ToString("G20")); 
Console.WriteLine(d.ToString("F20")); 

無論是"R""G"符打印出同樣的事情 - 的正確值:0.99999999999999989"F"符總是向上舍入爲1.0不管我有多少小數告訴包括。即使我告訴它打印99個小數的最大數目("F99"),它仍然只輸出「1」 - 接着是99個零。

因此,我的理解破裂,有人可以指向我的規範中的相關部分,或者是這種行爲打破? (這是沒有處理斷路器對我來說,我只是想知道。)

Here是我已經看了,但我看不到任何解釋這一點。

(這是.Net4.0)

回答

0

用戶「WB」鏈接到我懷疑有供這個問題...雖然有細節上的一些模糊的煩躁和最完美的回答另一個問題文檔。 (不幸的是,評論已被刪除。)

鏈接的問題是Formatting doubles for output in C#

總而言之,除非您使用GR說明符,否則在自定義格式化之前,輸出始終會減少到小數點後15位。任何人都可以鏈接到的最佳文檔是this MSDN page。細節和措辭並不像我希望的那樣清澈透明,但正如我所說,我認爲這是我將要找到的最好的。

+0

兩個評論,從鏈接不是很清楚。 1)數學是在基數2中完成的,所以從小數到二進制的轉換回到十進制數會發生影響結果四捨五入的結果。 2)可以使用PC微處理器內的浮點硬件或C#編譯器中的仿真來執行數學運算。因此,如果您在調試文件夾中使用可執行文件或使用release文件夾中的可執行文件,有時您會得到不同的答案。 – jdweng

+0

@jdweng請問您提到的最後一部分是JIT的實現細節嗎?無論如何,如果你可以鏈接到任何規範或其他文件,我很樂意閱讀它。 :) – AnorZaken

+0

如果我自己的記憶爲我服務,規範允許以更高的精度執行中間計算。換句話說,只要該值仍然在cpu寄存器中,它可能具有高於規定的精度。 (如果回寫到內存中,則額外的精度會丟失。)這並不總是合乎需要的,因此您可以使用cast-syntax通過強制轉換爲相同類型來截斷額外的精度。換句話說這個代碼:'float x =/* *一些計算* /; bool isIdentical = x ==(float)x;'可能並不總是像所期望的那樣返回true ... _(如果我正確記住了規範)_。 – AnorZaken