我使用了来自here的基本转换器并将其更改为使用ulong值,但是当转换大数字时,特别是高于16677181699666568的数字时,它返回的值不正确。我开始研究这个并发现Math.Pow(3,34)返回值16677181699666568,而实际上3 ^ 34是16677181699666569.这因此为我投入了一个扳手。我认为这只是Pow方法中双精度的问题吗?我最简单的解决方法是创建我自己的Pow,它需要ulong值吗?
如果是这样,做Pow的最快方法是什么?我假设每次都有一个比for循环更快的东西。
答案 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库)