我会疯了还是Math.Pow坏了?
我从这里使用了基本转换器,并将其更改为使用ulong值,但在转换大数字时,特别是数字高于16677181699666568时,它将返回不正确的值。 我开始研究这一点,发现Math.Pow(3,34)返回值为16677181699666568,实际上3 ^ 34是16677181699666569。这因此为我引发了一个扳手。 我认为这只是Pow方法中的双精度问题? 我最简单的解决方法就是创建我自己的Pow值,并获得ulong值?
如果是这样,做Pow的最快方法是什么? 我假设每次都有一个比乘法循环更快的东西。
你可以使用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
。
上一篇: Am I going crazy or is Math.Pow broken?
下一篇: C# vs C