Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将大整数映射到圆_C#_Math_Biginteger - Fatal编程技术网

C# 将大整数映射到圆

C# 将大整数映射到圆,c#,math,biginteger,C#,Math,Biginteger,我有一个使用160位数字的C#系统,存储在一个BigInteger中。我想在一个圆上显示这些东西,这意味着将0->2^160范围映射到0->2Pi范围。我该怎么做 一下子想到的方法是 BigInteger number; angle = (number / pow(2, 160)) * TwoPi; 但是,这很复杂,因为除法会将结果截断为整数。没有“复杂”,因为Math.Pow()返回一个双精度。所以只要BigInteger有一个(隐式)到double的转换,你就可以开始了 好的,还是从头开始

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

一下子想到的方法是

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

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

没有“复杂”,因为
Math.Pow()
返回一个
双精度
。所以只要BigInteger有一个(隐式)到double的转换,你就可以开始了

好的,还是从头开始

因为BigInteger的值是0->2^160,所以它比double小,double可以包含10^(-308)到10^(+308)

有一个问题

所以你要这样做:

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
,但可能有更好的位移位方法,或者您可以直接获取位。

它没有任何这样的转换,这意味着biginger/double不是合法代码它不是整数,它是大整数ger。这意味着BigInteger/double甚至不是有效代码。该示例代码仍然不好。当数字除以2^160时,它将被截断,因为您使用的是整数。然后转换twopi(显然有几个小数位)我刚刚独立提出了这个方法,正如你所说,它失去了一些准确性,但似乎还可以。可能是因为我是“唯一的”使用160位标识符,对于更大的数字是行不通的——但对于这个项目,我不在乎:如果你想要一个双精度的结果,你必须在双精度的范围内生存。你不能将160位信息塞进一个64位的结果,而不损失至少96位的“精度”.取最后32位是可以的。我想知道如何专门为C#bigIntegera这样做,据我所知,C#和.NET都没有BigIntegers。BigInteger是在.NET 4中引入的