2013-10-04 181 views
0

我試圖在.NET中創建一個「BigDouble」結構。 BigDouble數字有一個BigInteger組成部分和一個小數部分。乘以兩個BigDouble值

執行加法和減法很簡單,但我該怎麼做乘法/除法?問題是,我無法找到一種將BigInteger與double相乘的方法。我該怎麼辦?

請記住:我需要一個確切的樓層和一個近似的小數部分。

+0

對不起,你不能乘以一個BigInteger和一個double,並得到一個精確的整數部分。我們不能總是有我們想要的。 – 2013-10-04 13:54:35

+0

您可以將double轉換爲2 ** x *(a/b),其中x,a和b是適當大小的整數,然後從那裏繼續。 –

+4

我應該告訴你,這根本不是一個好主意。你似乎對雙重結構以及它是如何工作有一個基本的誤解。雙精度表示一個適合其大小的粒度值。通過將其固定爲1的分數,您只需簡單地丟棄double的幅度分量即可。由於你的小數部分始終是一個設定的magness,所以使用另一個整數類型值(無符號)。它的代表值將是該值除以該整數的最大值。根據您的小數分量的需要,這會給您的值介於0和1之間。 –

回答

0

A double具有固定數量的mantiassa比特和指數。根據IEEE規範,mantiassa將有52位,並且小數點之前的bis被忽略,但總是爲1.因此,實際上至少有53位信息超過小數點。如果幸運的話,小數部分很小,那麼可能會有更多的分辨率,但如果積分部分不爲零,這似乎不太可能。

因此,一種解決方案將小數部分乘以2並將其四捨五入爲整數。然後,您可以使用這些縮放值進行計算,使用它們形成更大的整數,然後縮小。如果您希望不惜一切代價避免數據丟失,則必須確定double號碼的指數並相應地進行縮放。我知道其他語言的一些功能,如Java中的Math.getExponent或C中的ilogb。我猜測在.net中有類似的東西,但我不知道它。

但是,這整個觀察告訴我(也可能告訴你),double可能不是存儲小數部分的適當方式。 double的優勢在於它的浮點數:您可以使用不斷變化的指數存儲極小值和極大值。然而,在你的應用程序中,你將以大約相等的概率存儲範圍[0,1)的值(或者我假設)。因此double的主要優勢沒有被使用。我想你可能會更好使用基於BigInteger的固定精度。我建議使用小數點後的64位。存儲要求將與您的方法相同,因爲double需要64位。但在大多數情況下,準確度會提高大約11位,因爲您可以使用全部64位的有用數字,而不是您的方法只有53位。性能也會好很多,因爲你不必在格式之間進行轉換。