我有一个使用 160 位数字的 C# 系统,存储在 BigInteger 中。我想将这些东西显示在一个圆圈上,这意味着将 0->2^160 范围映射到 0->2Pi 范围。我该怎么做?
立即想到的方法是
BigInteger number;
angle = (number / pow(2, 160)) * TwoPi;
但是,这很复杂,因为除法会将结果截断为整数。
我有一个使用 160 位数字的 C# 系统,存储在 BigInteger 中。我想将这些东西显示在一个圆圈上,这意味着将 0->2^160 范围映射到 0->2Pi 范围。我该怎么做?
立即想到的方法是
BigInteger number;
angle = (number / pow(2, 160)) * TwoPi;
但是,这很复杂,因为除法会将结果截断为整数。
好的,再次从头开始。
由于您的 BigInteger 介于 0 -> 2^160 之间,因此它小于双精度数,后者可以包含 10^(-308) 到 10^(+308)。
从 BigInteger 到 double的显式转换。
所以你这样做:
BigInteger number;
var angle = ((double)number / Math.Pow(2, 160)) * TwoPi;
我知道你会失去精确度,但这在圈子上应该没关系。
我对 C# 或其大整数一无所知,所以这里是在黑暗中刺伤:
除非您的显示器大约是(圆形)足球场的大小,否则您将不得不接受显示器的精度将远低于显示仅相差 1(或 10 或 100)的数字之间的任何分隔所需的精度或 10000000 甚至 10^40 但你必须弄清楚)。
我会简单地截断我的大整数,取最高阶 32 位并将它们视为无符号整数,然后将其除以2^32
将其带入范围 [0,1) (在我除法时将其转换为浮点数)并绘制它绕着圆圈那么远。
我想截断大整数以获得最左边的 32 位相当于将其除以,2^128
但可能有更好的位移方法,或者您可以简单地直接抓取这些位。