gpt4 book ai didi

python - 不同的sympy表达结果

转载 作者:太空宇宙 更新时间:2023-11-04 00:29:07 25 4
gpt4 key购买 nike

首先我想指出,我是一个彻头彻尾的sympy 菜鸟。

我正在尝试创建一个 Custom Formula-based Measurement使用此 sympy 表达式类:

from sympy import Symbol, S, floor, sympify, Float
SU = Symbol('millimeter')
exp = S(20.0) + floor((((SU-S(212.5)) / S(10.0))) / S(0.5)) * S(0.5)

我面临的问题是,对于相同的 SU,我会根据表达式的计算方式得到不同的结果。这就是我的意思:

>>> exp.subs(SU, 215)
20.0000000000000
>>> exp.evalf(subs={SU: 215})
0.e+1 #This is actually 16.0 when: float(exp.evalf(subs={SU: 215}))

更有趣的是,问题仅在 SU 介于 [213:217] 之间时存在(当我期望结果为 20.0 时)对于其余的值,它很好(AFAIK)

>>> exp.subs(SU, 212)
19.5000000000000
>>> exp.evalf(subs={SU: 212})
19.50
>>> exp.subs(SU, 218)
20.5000000000000
>>> exp.evalf(subs={SU: 218})
20.50

对于这种奇怪的行为有什么想法吗?

最佳答案

这是由于精度值不正确造成的。错误是 reported并已在 GitHub 上提供的当前版本的 SymPy 中得到更正; SymPy > 1.1.1 的版本不会有这个错误。


subs 的输出上使用 srepr 提供了一些解释:

x = Symbol('x')
srepr((floor(x)+20).evalf(subs={x:0.5}))

输出为 Float('16.0', precision=1)。这是二进制精度。 SymPy 认为 floor 的输出,当它恰好为零时,只有一位精度。因此它随后相应地截断添加的 +20 到最接近的 2 的幂。

当然,这是一个错误。有几个与 Float 类和舍入相关的未解决问题,例如 this one ;它们可能是相关的。

解决方法是避免evalf(subs=dict) 构造(甚至有记录吗?)。按自然顺序使用方法:代入,然后求值,给出正确的结果:

srepr((floor(x)+20).subs({x:0.5}).evalf())
"Float('20.0', precision=53)"

关于python - 不同的sympy表达结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46451709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com