我疯了还是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

或者,您可以使用其他人创建的好库:

http://intx.codeplex.com/(IntX库)