我疯了还是Math.Pow坏了?

Wil*_*ood 3 c# precision double pow

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

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

Yur*_*ich 6

你可以使用BigInteger.Pow.或者用我的力量方法进行long.


Jon*_*eet 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));
Run Code Online (Sandbox Code Playgroud)

那打印16677181699666568.

换句话说,无论Math.Pow内部是什么,它都不能返回比你得到的结果更准确的结果.

正如其他人所说,BigInteger.Pow如果您使用的是.NET 4,那么您的朋友是谁.


Ric*_*ard 5

阅读每个计算机科学家应该知道的浮点数

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

如果您想要精确的结果使用BigInteger.