【问题标题】:Am I going crazy or is Math.Pow broken?我是疯了还是 Math.Pow 坏了?
【发布时间】:2011-07-21 09:47:08
【问题描述】:

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

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

【问题讨论】:

  • 谢谢大家... BigInteger.Pow 效果很好。

标签: c# double precision pow


【解决方案1】:

您可以使用BigInteger.Pow。或者将my power method 用于long

【讨论】:

    【解决方案2】:

    阅读What Every Computer Scientist Should Know About Floating-Point

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

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

    【讨论】:

      【解决方案3】:

      如果您使用的是 .NET Framework 4,Microsoft 已包含一个新的 BigInteger 类,可让您处理大数。

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

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

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

      【讨论】:

        【解决方案4】:

        问题是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 是您的朋友。

        【讨论】:

          【解决方案5】:

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

          是的。

          是我最简单的解决方法只是创建我的 拥有 ulong 值的 Pow?

          您可以使用 BigInteger.Pow。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-08
            • 2011-03-27
            • 2022-09-30
            • 1970-01-01
            • 2018-12-22
            相关资源
            最近更新 更多