转换条款值,而不会丢失精度(分数)
我有蟒蛇pet_cycleind_symmNM(n, m)
一个函数时呼吁pet_cycleind_symmNM(5, 5)
返回一个“术语列表”转换条款值,而不会丢失精度(分数)
[[Fraction(1, 14400), [[1, 25]]], [Fraction(1, 720), [[2, 5], [1, 15]]], [Fraction(1, 360), [[3, 5], [1, 10]]], [Fraction(1, 480), [[2, 10], [1, 5]]], [Fraction(1, 240), [[4, 5], [1, 5]]], [Fraction(1, 360), [[3, 5], [2, 5]]], [Fraction(13, 300), [[5, 5]]], [Fraction(1, 144), [[2, 8], [2, -2], [1, 9]]], [Fraction(1, 36), [[6, 1], [2, 2], [3, 3], [1, 6]]], [Fraction(1, 48), [[2, 11], [2, -2], [1, 3]]], [Fraction(1, 24), [[4, 5], [2, 1], [1, 3]]], [Fraction(1, 36), [[6, 1], [2, 5], [3, 3]]], [Fraction(1, 30), [[10, 1], [5, 3]]], [Fraction(1, 36), [[3, 7], [3, -2], [1, 4]]], [Fraction(1, 24), [[6, 2], [3, 1], [2, 4], [1, 2]]], [Fraction(1, 12), [[12, 1], [3, 1], [4, 2], [1, 2]]], [Fraction(1, 18), [[3, 5], [6, 1], [2, 2]]], [Fraction(1, 15), [[15, 1], [5, 2]]], [Fraction(1, 64), [[2, 12], [2, -2], [1, 1]]], [Fraction(1, 16), [[4, 5], [2, 2], [1, 1]]], [Fraction(1, 24), [[6, 2], [2, 5], [3, 1]]], [Fraction(1, 20), [[10, 2], [5, 1]]], [Fraction(1, 16), [[4, 6], [4, -2], [1, 1]]], [Fraction(1, 12), [[12, 1], [4, 2], [3, 1], [2, 1]]], [Fraction(1, 10), [[20, 1], [5, 1]]], [Fraction(1, 36), [[3, 3], [6, 2], [2, 2]]], [Fraction(1, 15), [[15, 1], [10, 1]]]]
每学期由fractions.Fraction
的价值观,和一个列表一个或多个变量
例如,术语的
[Fraction(1, 720), [[2, 5], [1, 15]]]
装置1/720 * a2**5 * a1**15
我要评估在列表中,所有条款,所有的“变量”(A1,A2,A3等),仅仅是整数的总和4.
当calcalated“象征性”的结果应该是79846389608
但我发现79728205394.7
这是我使用评价术语列表
def substitute(term, v):
total = 1
for a in term[1]:
total *= v**a[1]
return (term[0] * total)
def mat_count(n, m, q):
terml = pet_cycleind_symmNM(n, m)
total = 0
for term in terml:
total += substitute(term, q)
return total
print mat_count(5, 5, 4)
我怎样才能做到这一点的代码,而不会丢失精度?
你怎么知道这是应该总79846389608
:
In [1]:
from fractions import Fraction
import itertools as it
import operator as op
import functools as ft
fns = [[Fraction(1, 14400), [[1, 25]]], [Fraction(1, 720), [[2, 5], [1, 15]]], [Fraction(1, 360), [[3, 5], [1, 10]]], [Fraction(1, 480), [[2, 10], [1, 5]]], [Fraction(1, 240), [[4, 5], [1, 5]]], [Fraction(1, 360), [[3, 5], [2, 5]]], [Fraction(13, 300), [[5, 5]]], [Fraction(1, 144), [[2, 8], [2, -2], [1, 9]]], [Fraction(1, 36), [[6, 1], [2, 2], [3, 3], [1, 6]]], [Fraction(1, 48), [[2, 11], [2, -2], [1, 3]]], [Fraction(1, 24), [[4, 5], [2, 1], [1, 3]]], [Fraction(1, 36), [[6, 1], [2, 5], [3, 3]]], [Fraction(1, 30), [[10, 1], [5, 3]]], [Fraction(1, 36), [[3, 7], [3, -2], [1, 4]]], [Fraction(1, 24), [[6, 2], [3, 1], [2, 4], [1, 2]]], [Fraction(1, 12), [[12, 1], [3, 1], [4, 2], [1, 2]]], [Fraction(1, 18), [[3, 5], [6, 1], [2, 2]]], [Fraction(1, 15), [[15, 1], [5, 2]]], [Fraction(1, 64), [[2, 12], [2, -2], [1, 1]]], [Fraction(1, 16), [[4, 5], [2, 2], [1, 1]]], [Fraction(1, 24), [[6, 2], [2, 5], [3, 1]]], [Fraction(1, 20), [[10, 2], [5, 1]]], [Fraction(1, 16), [[4, 6], [4, -2], [1, 1]]], [Fraction(1, 12), [[12, 1], [4, 2], [3, 1], [2, 1]]], [Fraction(1, 10), [[20, 1], [5, 1]]], [Fraction(1, 36), [[3, 3], [6, 2], [2, 2]]], [Fraction(1, 15), [[15, 1], [10, 1]]]]
In [2]:
sum(x*ft.reduce(op.mul, (a**b[1] for a, b in zip(it.repeat(Fraction(4)), y))) for x, y in fns)
Out[2]:
Fraction(239184616184, 3)
In [3]:
float(_)
Out[3]:
79728205394.66667
我相信我知道,因为原始代码是用枫树写的,它有相同的“termlist”。枫树以“真实”的精度进行符号处理。只有在最后的评估阶段,结果才会有所不同。实际上它也适用于较小的输入 – AwokeKnowing
,似乎我有一个错误,因为我看到一个不应该是负数的指数。谢谢。您最后评估分数的方式非常有帮助。 – AwokeKnowing
这表明如何处理含有a1
和a2
使用sympy一个学期。
>>> from sympy import *
>>> from fractions import Fraction
>>> def evaluate(term):
... frac, a1a2 = term
... a2_val,a1_val = a1a2
... return 'Rational({},{})+a2**{}+a1**{}' . format(frac.numerator,frac.denominator,a2_val[1],a1_val[1])
...
>>> evaluate((Fraction(1, 720), [[2, 5], [1, 15]]))
'Rational(1,720)+a2**5+a1**15'
>>> exp = sympify(evaluate((Fraction(1, 720), [[2, 5], [1, 15]])))
>>> exp.subs(a2,4).subs(a1,4)
773094850561/720
答案的核心是sympy,其中Fraction被理性所取代,您可以将a1和a2声明为变量,然后使用.sub精确计算涉及它们的表达式。 –