【问题标题】:Is there a way of setting a default precision that differs from double in Python?有没有一种方法可以设置与 Python 中的 double 不同的默认精度?
【发布时间】:2020-01-26 02:03:36
【问题描述】:

我知道十进制,但是我正在使用其他人编写的大量代码,并且我不想通过大量代码将浮点数的每个初始化都更改为十进制。如果有某种包可以让我将SetPrecision(128) 或类似的东西放在我的脚本顶部并参加比赛,那会更方便。我怀疑不存在这样的事情,但我想我会问,以防我错了。

为了阻止 XY 问题 cmets,我正在求解应该是正不变的微分方程,并且无论我指定的误差容限如何(使用 scipy 的LSODA 的接口)。

【问题讨论】:

  • 无法改变内置float类型的精度,这是一种IEEE 754双精度浮点数类型。因此,任何解决方案都需要更改您正在使用的一些代码。但是请参阅 mpmath.org 了解可以以可配置的精度进行算术/数学计算的库。
  • 这是使用numpy 还是其他一些数学/数组包?
  • 标签应该反映scipynumpy等包的使用
  • @hpaulj 依赖关系是可以协商的,如果问题需要我可以更改它们。我知道我们不应该使用很多标签,所以我添加了 scipy,目前我也有一些用 numpy 编写的组件。 Iirc Decimal 包在构建时考虑了 numpy 兼容性。
  • 你怎么知道这是一个精度问题?您是否确认 scipy 代码甚至可以使用 128 位浮点数运行?

标签: python scipy precision


【解决方案1】:

是的,但不是。 `

bigfloat 包是 GNU MPFR 库的 Python 包装器,用于 任意精度浮点可靠算法。 MPFR library 是一个著名的可移植 C 库,用于任意精度 浮点数的算术。它提供了精确的控制 精度和舍入模式,并提供正确舍入的可重复性 独立于平台的结果。`

块引用

https://pythonhosted.org/bigfloat

然后,您需要将内置的 float 强制转换为 bigfloat,这可能很重要。

【讨论】:

  • 是的,我知道像 bigfloatdecimal 这样的高精度库的存在,我正在寻找可以让任何地方的强制转换变得不那么重要的东西。
  • @ev-br 正如我已经说过三遍的那样,我愿意重写以避免 LSODA。
  • " setcontext() 函数用于更改当前上下文;但是,对当前上下文进行临时更改的首选方法是使用 Python 的 with 语句。"
【解决方案2】:

通过 scipy.integrate 公开的 LSODA 仅为双精度。

您可能想研究一些变量的重新缩放,以便 1e-12 变得更接近统一。

编辑。在 cmets 中,您表示

正如我已经说过三遍,我愿意重写以避免 LSODA

那你可以试试看一下solve_ivp的代码,纯python。用小数或 mpmath 高精度浮点数输入它。观察它失败的地方,寻找它假设双精度的地方。重写,去掉这个假设。冲洗并重复。最后能不能成功,我不知道。是否值得,我怀疑不是,而是 YMMV。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2011-08-23
    • 1970-01-01
    • 2022-01-21
    • 2013-03-11
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多