我有一个使用160位数字的C#系统,存储在BigInteger中。我想在圆上显示这些东西,这意味着将0-> 2^160范围映射到0-> 2Pi范围。我将如何做到这一点?将BigInteger映射到一个圆圈
,可以立即跳转到心灵的方法是
BigInteger number;
angle = (number/pow(2, 160)) * TwoPi;
但是,具有复杂性,因为该司将截断结果为整数。
我有一个使用160位数字的C#系统,存储在BigInteger中。我想在圆上显示这些东西,这意味着将0-> 2^160范围映射到0-> 2Pi范围。我将如何做到这一点?将BigInteger映射到一个圆圈
,可以立即跳转到心灵的方法是
BigInteger number;
angle = (number/pow(2, 160)) * TwoPi;
但是,具有复杂性,因为该司将截断结果为整数。
好的,从一开始。由于你的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;
我知道你会失去精度,但不应该在圈子没关系。
没有'复杂性',因为Math.Pow()
返回double
。所以只要BigInteger有一个(隐含)对话加倍,你就很好。
它没有任何这样的转换,这意味着BigInteger/double不合法代码 – Martin 2010-04-28 12:18:15
Jeez,所以它只有一个明确的转换。 – 2010-04-28 12:28:28
我什么都不知道的C#或它的大整数,所以这里是一个在黑暗中刺伤:
除非你的显示器是关于你将有一个(圆形)足球场的大小,接受精度您的显示器的数量将远远小于仅显示1个数字(或10或100或10000000或甚至10^40但您必须弄清楚)的数字之间的分隔所需的数量。
我会简单地截断我的大整数,取最高的32位,并将它们视为一个无符号整数,然后将其除以2^32
使其进入[0,1)范围(将其转换为浮点数我划分)并绘制在圆周上。
我猜想截断大整数得到最左边的32位相当于将它除以2^128
,但可能有更好的位移方法,或者您可能只需直接获取位。
取最后的32位是好的。我一直在寻找如何为C#BigInteger专门做的建议 – Martin 2010-04-28 18:44:46
据我所知,C#和.NET都没有BigIntegers。 – 2010-04-29 01:40:13
BigInteger在.net 4中引入http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx – Martin 2010-04-29 09:25:56