2010-04-28 102 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