【问题标题】:Set Python calculating precision higher than 15 digits设置 Python 计算精度高于 15 位
【发布时间】:2015-05-02 17:38:42
【问题描述】:

如需更准确地了解我的问题,请查看此处: Polygonally calculate Pi

我使用mpmathdecimal 和其他一些模块来显示超过标准数量的数字,但只有前 15 个是正确的 - 这意味着当我运行我的程序计算 pi 时,第一个之后的其余部分15 位是不准确的。

或者如果我说mpf(1/3),它会打印0.3333333333333331574563241647...。有什么方法可以让 Python 用精确的数字进行计算?这对我来说非常非常重要,因为我的方法会产生像 0.0000000000000000000000245331° 这样的角度,如果它是圆角的,我就有问题了。

我尝试的另一个示例是使用和不使用 decimal 模块计算 0.0001 + 0.0002 - 0.0003。没有它打印0.0,它给出了某种1.5223456224E-31。我假设这个问题来自 Python 的二进制计算?

你知道一种可以精确计算它的语言吗?或者更好地如何在 Python 中实现它?

PS:15位后精度不够的问题出在哪里?

【问题讨论】:

  • 是的,它与浮点数的二进制表示有关(这不是 Python独有的,您根本无法用有限数表示无限范围的实数位) - 参见例如docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。如果您使用有理数,请考虑fractions
  • 也许本指南floating-point-gui.de 会更方便您阅读
  • 我不知道它是否适合您的问题,但是您是否已经考虑过使用定点操作?因为它,你只需要乘以,比方说,每个角度 10^6,这样你就可以提高精度。但是,正如您可能注意到的那样,这只是取代了问题......
  • 我可以用一个bignum来解决这个问题吗?

标签: python binary polygon digits pi


【解决方案1】:

问题在于如何创建变量。当您执行mpf(1/3) 时,Python 首先将1/3 计算为64 位近似值,然后mpmath 将该近似值转换为更高的精度,但错误已经存在。您需要使用确切的参数初始化变量。 mpf(1)/3 应该会提供预期的结果。

【讨论】:

    猜你喜欢
    • 2017-09-23
    • 2017-07-25
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2012-01-07
    • 2012-08-29
    相关资源
    最近更新 更多