2010-04-28 89 views
1

我有一個使用160位數字的C#系統,存儲在BigInteger中。我想在圓上顯示這些東西,這意味着將0-> 2^160範圍映射到0-> 2Pi範圍。我將如何做到這一點?將BigInteger映射到一個圓圈

,可以立即跳轉到心靈的方法是

BigInteger number; 
angle = (number/pow(2, 160)) * TwoPi; 

但是,具有複雜性,因爲該司將截斷結果爲整數。

+0

據我所知,C#和.NET都沒有BigIntegers。 – 2010-04-29 01:40:13

+0

BigInteger在.net 4中引入http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx – Martin 2010-04-29 09:25:56

回答

2

好的,從一開始。由於你的BigInteger是從0 - > 2^160,所以它比包含10 ^( - 308)到10 ^(+ 308)的double更小。有一個explicit conversion from BigInteger to double

所以,你這樣做:

BigInteger number; 
var angle = ((double)number/Math.Pow(2, 160)) * TwoPi; 

我知道你會失去精度,但不應該在圈子沒關係。

+0

這不是一個整數,它是一個大整數。這意味着BigInteger/double甚至沒有有效的代碼 – Martin 2010-04-28 12:19:15

+0

,示例代碼仍然不好。當數字除以2^160時,它將被截斷,因爲你使用整數。然後你將twopi(顯然有幾個小數位)轉換成一個整數,然後再將其截斷。 – Martin 2010-04-28 12:26:15

+0

這個版本呢? :) – Snake 2010-04-28 12:33:07

-1

沒有'複雜性',因爲Math.Pow()返回double。所以只要BigInteger有一個(隱含)對話加倍,你就很好。

+0

它沒有任何這樣的轉換,這意味着BigInteger/double不合法代碼 – Martin 2010-04-28 12:18:15

+0

Jeez,所以它只有一個明確的轉換。 – 2010-04-28 12:28:28

1

我什麼都不知道的C#或它的大整數,所以這裏是一個在黑暗中刺傷:

除非你的顯示器是關於你將有一個(圓形)足球場的大小,接受精度您的顯示器的數量將遠遠小於僅顯示1個數字(或10或100或10000000或甚至10^40但您必須弄清楚)的數字之間的分隔所需的數量。

我會簡單地截斷我的大整數,取最高的32位,並將它們視爲一個無符號整數,然後將其除以2^32使其進入[0,1)範圍(將其轉換爲浮點數我劃分)並繪製在圓周上。

我猜想截斷大整數得到最左邊的32位相當於將它除以2^128,但可能有更好的位移方法,或者您可能只需直接獲取位。

+0

取最後的32位是好的。我一直在尋找如何爲C#BigInteger專門做的建議 – Martin 2010-04-28 18:44:46