代码之家  ›  专栏  ›  技术社区  ›  Martin

将大整数映射到圆

  •  1
  • Martin  · 技术社区  · 14 年前

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

    立即想到的方法是

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

    但是,由于除法会将结果截断为整数,所以这一点很复杂。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Anemoia    14 年前

    好的,再一次,从一开始。

    因为您的大整数是0->2^160,所以它小于一个双整数,它可以包含10^(-308)到10^(+308)。

    有一个 explicit conversion from BigInteger to double .

    所以你这样做:

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

    我知道你会失去精确性,但这在圆上不重要。

        2
  •  1
  •   High Performance Mark    14 年前

    我对C或它的大整数一无所知,所以这里有一个黑暗中的刺:

    除非你的显示器是一个(圆形)足球场的大小,否则你必须接受,你的显示器的精度将远远低于显示只有1个相距(或10或100或10000000,甚至10^40)的数字之间的任何间隔所需的精度,但你必须计算出UT)。

    我只需截短我的大整数,取最高的32位,将其作为无符号整数,然后除以 2^32 把它带到范围[0,1]中(按我的除法将其转换为浮点),并绘制出圆的远圆。

    我猜截断大整数得到最左边的32位等于除以 2^128 但是可能会有更好的位转移方法,或者您可以直接获取位。

        3
  •  -1
  •   Henk Holterman    14 年前

    没有“复杂性”,因为 Math.Pow() 返回 double . 所以只要biginteger有一个(隐式)转换为double,你就可以走了。