4

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

如果是这样,做 Pow 的最快方法是什么?我认为有比每次乘法的 for 循环更快的东西。

4

5 回答 5

7

您可以使用BigInteger.Pow。或者使用我的幂long法。

于 2011-03-23T15:08:21.337 回答
6

问题是Math.Pow返回 a double,最接近double16677181699666569 的值为 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,那是您的朋友。

于 2011-03-23T15:09:08.730 回答
5

阅读每位计算机科学家应了解的浮点知识

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

如果您想要准确的结果,请使用BigInteger.

于 2011-03-23T15:08:46.347 回答
1

我认为这只是 Pow 方法中的双精度问题?

是的。

我最简单的解决方法是创建自己的带有 ulong 值的 Pow 吗?

您可以使用 BigInteger.Pow。

于 2011-03-23T15:10:32.973 回答
0

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

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

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

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

于 2011-03-23T15:09:03.630 回答