我有一个使用160位数的C#系统,存储在BigInteger中。我想在圆上显示这些东西,这意味着将0-> 2 ^ 160范围映射到0-> 2Pi范围。我该怎么做?
立刻想到的方法是
BigInteger number;
angle = (number / pow(2, 160)) * TwoPi;
然而,这具有复杂性,因为除法会将结果截断为整数。
答案 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有一个(隐含的)转换加倍,你就可以了。