我疯了还是Math.Pow坏了?
我从这里使用了基本转换器并将其更改为使用ulong值,但是当转换大数字时,特别是高于16677181699666568的数字时,它返回的值不正确。 我开始研究这个并发现Math.Pow(3,34)返回值16677181699666568,而实际上3 ^ 34是16677181699666569.这因此为我投入了一个扳手。 我认为这只是Pow方法中双精度问题? 我最简单的解决方法就是创建我自己的Pow,它需要ulong值吗?
如果是这样,做Pow的最快方法是什么? 我假设每次都有一个比for循环更快的东西。
您可以使用BigInteger.Pow 。 或者long
使用我的力量方法 。
问题是Math.Pow
返回一个double
,最接近16677181699666569的double
值是16677181699666568。
所以没有让Math.Pow
参与:
long accurate = 16677181699666569; double closestDouble = accurate; // See http://pobox.com/~skeet/csharp/DoubleConverter.cs Console.WriteLine(DoubleConverter.ToExactString(closestDouble));
那打印16677181699666568。
换句话说, 无论Math.Pow
在内部做什么 ,它都不能返回比你得到的结果更准确的结果。
正如其他人所说,如果您使用的是.NET 4, BigInteger.Pow
就是您的朋友。
阅读每个计算机科学家应该知道的浮点数
浮点类型是近似值,您看到的舍入是正常的。
如果您想要精确的结果,请使用BigInteger
。
我认为这只是Pow方法中双精度问题?
是。
我最简单的解决方法就是创建我自己的Pow,它需要ulong值吗?
您可以使用BigInteger.Pow。
如果您使用的是.NET Framework 4,那么Microsoft已经包含了一个新的BigInteger类,可以让您操作大数字。
http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx
或者,您可以使用其他人创建的好库: