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

链接地址: http://www.djcxy.com/p/82151.html

上一篇: Am I going crazy or is Math.Pow broken?

下一篇: C# vs C