7

分子と分母としてsfractions.Fractionをサポートする純粋なPython実装はありますか?long残念ながら、べき乗はfloat(ack !!!)を返すようにコード化されているようです。これは、少なくとも。の使用をサポートする必要がありdecimal.Decimalます。

float()ない場合は、おそらくライブラリのコピーを作成して、発生したものをから適切なものに置き換えようと試みることができると思いますが、Decimal以前に他の人によってテストされたものが望ましいです。

コード例は次のとおりです。

base = Fraction.from_decimal(Decimal(1).exp())
a = Fraction(69885L, 53L)
x = Fraction(9L, 10L)

print base**(-a*x), type(base**(-a*x))

結果として0.0 <type 'float'>、答えは非常に小さい小数になります。

更新:今のところ、次の回避策があります(a ** bの場合、両方が分数であると仮定します。もちろん、exp_がfloatであるか、それ自体がDecimalである場合は、別の関数が必要になります):

def fracpow(base, exp_):
    base = Decimal(base.numerator)/Decimal(base.denominator)
    exp_ = Decimal(exp_.numerator)/Decimal(exp_.denominator)

    return base**exp_

これは答え4.08569925773896097019795484811E-516を与えます。

追加の関数なしでこれを行うためのより良い方法があるかどうかはまだ興味があります(Fractionクラスで十分に作業すれば、他のフロートが私の結果に影響を与えることがわかります)。

4

2 に答える 2

7

r「累乗」は、有理数に対する閉じた演算ではありません(通常の4つの算術演算とは異なります)。のような有理数はありませんr == 2 ** 0.5。伝説によると、ピタゴラス(その定理からこの事実は単純に続く)は、これを証明するという恐ろしい犯罪のために弟子のヒッパソスを殺した。ピタゴラスの疑惑の反応に同情しているように見えます;-)「すべき」の奇妙な使用法を考えると。

Pythonの分数は正確であることが意図されているため、必然的に、分数を別の分数の累乗に上げると、結果として分数を返すことが絶対にできない場合があります。そして「すべき」は、数学的な不可能性に賢明に適用することはできません。

したがって、できる最善の方法は、たとえば、正確な分数ではない結果を取得し(フロートは目的に十分であると見なされます)、さらに分数で近似することによって、目的の結果を概算することです。ほとんどの既存の純粋なPython実装(ネット上には多くの rationals.pyファイルがあります;-)は、**演算子をまったく実装しないことを好みますが、もちろん、独自の実装で別の設計上の決定を行うことを妨げるものは何もありません!-)

于 2010-01-11T00:42:29.220 に答える
0

浮動小数点のべき乗を使用しない分数に対して、独自の「pow」関数を作成できます。それはあなたがやろうとしていることですか?

これにより、小数部が整数乗になり、浮動小数点にフォールバックします。

def pow( fract, exp ):
    if exp == 0: 
        return fract
    elif exp % 2 == 0:
        t = pow( fract, exp//2 )
        return t*t
    else:
        return fract*pos( fract, exp-1 )
于 2010-01-11T00:09:28.087 に答える