2014-08-28 70 views
0

最近我一直在與System.Numerics.Complex一起工作,並且我已經開始注意到存儲值的計算結果爲十分之一百萬分之一秒或其他類似的典型浮點「漂移」,這是衆所周知的常見現象與float類型,甚至double類型。我查看了Complex結構,果然,它使用了double變量。爲什麼它使用double值來存儲其數據而不是decimal值,這些值旨在防止這種情況發生?我如何解決這個問題?爲什麼System.Numerics.Complex使用雙精度而不是小數?

+6

'decimal'不旨在防止漂移。它旨在表示精確的十進制值。它使用128位的事實可能會使漂移更容易被你接受,但是額外的精度會帶來如此高的性能成本,設計者認爲多數情況可以通過基於double的Complex類型更好地服務。 – 2014-08-28 08:03:13

+2

自然不會用10個手指計數,只有人類能做到。 – 2014-08-28 08:16:09

+0

.NET的十進制也有一個相當小的指數(十進制,它被稱爲「比例」)範圍,或多或少在10^28和10^-28之間。 Double有更大的範圍。 – 2014-08-28 11:31:32

回答

2

要回答你的問題:

  1. double s爲幅度快幾個數量級,因爲操作是在硬件層級進行
  2. 基2漂浮其實是可以用於大型計算的準確,因爲在上下移動指數時有較少的「擺動」:1位精度小於1位十進制數字。而且,base-2可以使用隱含的前導位,這意味着它們可以表示比其他基數更多的數字。
  3. 複數通常用於科學/工程應用,其中大約10 -16的小相對誤差超過其他誤差源(例如由於測量或模型)。在另一方面
  4. 小數通常用於「會計」類型的操作,其中,舍入誤差通常是可忽略的(即,除了少量的,由整數乘法等)
相關問題