2

ファイルにいくつかの数学関数 (文字列として表される) があります。

1+a**(b/(3*a+1))
(1+a)**(b/(3*a+1))
...

**文字列内のすべての s を に変換するにはどうすればよいmath.powですか?

編集:私が解決しようとしているのは次のとおりです:評価するこの関数がたくさんありますが、1つに多くの時間を費やすことはできません。

時々、関数は次のようになります:

(3**100**100**2)

Python はそれを評価しようとしますが、これは非常に長いです。代わりに次のようなエラーが必要です。

>>> math.pow(3, math.pow(100, 100))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: math range error

編集2:答えてくれてありがとう、私はついにそれを行う方法を見つけました.あなたの答えとコメントは私を大いに助けてくれました. ファイルの先頭にある次の行で強制的に浮動小数点数を除算する必要がありました。

      from __future__ import division
4

2 に答える 2

0

ここで回避しようとしているように見えるのは、長い整数演算であり、実行に非常に長い時間がかかる可能性があります。これを修正する最も簡単な方法は次のとおりです。

class Floatify(ast.NodeTransformer):
    def visit_Num(self, node):
        return ast.Num(float(node.n))

使用する場合:

>>> node = ast.parse("(3**100**100**2)", mode="eval")
>>> node = Floatify().visit(node)
>>> code = compile(node, "<string>", mode="eval")
>>> eval(code)

Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    eval(code)
  File "<string>", line 1, in <module>
OverflowError: (34, 'Result too large')
于 2013-07-22T15:09:50.160 に答える