【问题标题】:increasing float-point numbers accuracy [closed]提高浮点数的准确性
【发布时间】:2012-11-18 17:21:16
【问题描述】:

如何将默认浮点数精度切换为另一个,也许是自定义的?我需要这个,因为我做了一些计算,我发现我应该提高默认浮点精度。

【问题讨论】:

  • Python 和 numpy 默认使用双精度浮点数。是什么让你认为它的“准确性”不足?
  • 您可以使用decimals 进行计算,但您会失去numpy 的性能优势。据我所知,您无法摆脱这种权衡 - 处理器可以原生使用的最精确的数据类型是 numpy 使用的那种。
  • 我正在求解微分方程,其中我不能使用十进制数,而且我遇到了一个问题,在我看来,这个问题来自精度损失。
  • 人们有时使用的一个选项是使用值的 log() 而不是原始值。值得研究一下,因为这样您就不需要任何库了。

标签: python numpy


【解决方案1】:

我最近不得不处理这个问题,mpmath 非常完美。它是纯 python,在 BSD 许可下。

Mpmath 是一个用于多精度浮点运算的纯 Python 库。它提供了广泛的超越函数、无限指数大小、复数、区间算术、数值积分和微分、求根、线性代数等等。几乎任何计算都可以以 10 位或 1000 位精度执行,并且在许多情况下,mpmath 实现了渐近快速算法,可以很好地扩展以适应极高精度的工作

它不会太慢,如果安装了它可以利用gmpy 库(C-coded Python extension modules that support fast multiple-precision arithmetic)。

【讨论】:

  • 使用 scipy.integrate.odeint 我得到“TypeError: array cannot be safe cast to required type” =( 似乎 scipy.integrate.odeint 将所有内容都转换为浮点数。
  • 但它有自己的 ode 求解器 - odefun。好的,让这成为解决方案。
  • 更新了关于 unlimitedness 的文本:“Mpmath 使用任意精度整数作为尾数和指数,因此数字的大小可以与计算机内存允许的一样大。当处理非常大的数字。”
【解决方案2】:

如果您想要更高的准确度,我建议您使用bigfloat 包(因为这是它的用途)。或者,您也可以查看 Decimal 类。

【讨论】:

  • 是否可以让 scipy.integrate 和 bigfloat 相互处理?目前,当将 BigFloat 参数传递给 scipy.integrate.odeint 时,我得到“TypeError:数组无法安全地转换为所需类型”
  • @user983302 也许this 会帮助你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
相关资源
最近更新 更多