1

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

立即想到的方法是

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

但是,这很复杂,因为除法会将结果截断为整数。

4

2 回答 2

2

好的,再次从头开始。

由于您的 BigInteger 介于 0 -> 2^160 之间,因此它小于双精度数,后者可以包含 10^(-308) 到 10^(+308)。

从 BigInteger 到 double的显式转换。

所以你这样做:

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

我知道你会失去精确度,但这在圈子上应该没关系。

于 2010-04-28T12:11:37.803 回答
1

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

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

我会简单地截断我的大整数,取最高阶 32 位并将它们视为无符号整数,然后将其除以2^32将其带入范围 [0,1) (在我除法时将其转换为浮点数)并绘制它绕着圆圈那么远。

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

于 2010-04-28T12:48:48.967 回答