将BigInteger映射到圆圈

时间:2010-04-28 12:04:22

标签: c# math biginteger

我有一个使用160位数的C#系统,存储在BigInteger中。我想在圆上显示这些东西,这意味着将0-> 2 ^ 160范围映射到0-> 2Pi范围。我该怎么做?

立刻想到的方法是

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

然而,这具有复杂性,因为除法会将结果截断为整数。

3 个答案:

答案 0 :(得分:2)

好的,从一开始就再次。

由于您的BigInteger来自0 - > 2 ^ 160它小于一个double,它可以包含10 ^( - 308)到10 ^(+ 308)。

explicit conversion from BigInteger to double

所以你这样做:

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

我知道你会失去精确度,但这对圆圈来说无关紧要。

答案 1 :(得分:1)

我对C#或其大整数一无所知,所以这里是黑暗中的刺:

除非您的显示器大小与(圆形)足球场的大小相同,否则您将不得不接受显示器的精确度将远远小于显示相距仅1的数字之间的任何间隔所需的精度(或者10或100或10000000甚至10 ^ 40但你必须弄清楚)。

我只是截断我的大整数,取最高位32位并将它们视为无符号整数,然后将其除以2^32以使其进入范围[0,1)(将其转换为浮点数) - 当我划分时,并将其绘制在远离圆圈的地方。

我猜截断大整数以获得最左边的32位相当于将其除以2^128,但可能有更好的位移方法,或者您可以直接抓取位。

答案 2 :(得分:-1)

没有“复杂性”,因为Math.Pow()会返回double。因此,只要BigInteger有一个(隐含的)转换加倍,你就可以了。