我疯了还是Math.Pow坏了?

时间:2011-03-23 15:05:43

标签: c# double precision pow

我使用了来自here的基本转换器并将其更改为使用ulong值,但是当转换大数字时,特别是高于16677181699666568的数字时,它返回的值不正确。我开始研究这个并发现Math.Pow(3,34)返回值16677181699666568,而实际上3 ^ 34是16677181699666569.这因此为我投入了一个扳手。我认为这只是Pow方法中双精度的问题吗?我最简单的解决方法是创建我自己的Pow,它需要ulong值吗?

如果是这样,做Pow的最快方法是什么?我假设每次都有一个比for循环更快的东西。

5 个答案:

答案 0 :(得分:6)

您可以使用BigInteger.Pow。或者long使用{{1}}。

答案 1 :(得分:6)

问题是Math.Pow会返回double,而最接近double的值为16677181699666569的是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做什么,它都无法返回比你得到的结果更准确的结果。

正如其他人所说,BigInteger.Pow是你的朋友,如果你使用的是.NET 4。

答案 2 :(得分:5)

阅读 What Every Computer Scientist Should Know About Floating-Point

浮点类型是近似值,您看到的舍入是正常的。

如果您想要精确结果,请使用BigInteger

答案 3 :(得分:1)

  

我认为这只是一个问题   Pow内部的双精度   方法

  

我最简单的解决办法是创建我的   拥有ulong值的自己的Pow?

您可以使用BigInteger.Pow。

答案 4 :(得分:0)

如果您使用的是.NET Framework 4,那么Microsoft已经包含了一个新的BigInteger类,可以让您操作大数字。

http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

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

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