سؤال

هل هناك تطبيق بيثون نقي fractions.Fraction هذا يدعم longS كما البسط والقاسم؟ لسوء الحظ، يبدو أنه يرمز للأسف لإعادة تعويم (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'> حيث يجب أن تكون الجواب عشري صغير حقا.

تحديث: لقد حصلت على العمل التالي في الوقت الحالي (على افتراض وجود ** ب، أن كلاهما هما كسور؛ بالطبع، سأحتاج إلى وظيفة أخرى عند إكسب_ هو تعويم أو هو نفسه عشري):

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 فئة بما فيه الكفاية، سأجد عوامات أخرى تعمل طريقها إلى نتائجي).

هل كانت مفيدة؟

المحلول

"رفع إلى قوة" ليست عملية مغلقة على المناولة (بشكل مختلف عن العمليات الحسابية الرابعة المعتادة): لا يوجد عدد عن عقلاني r مثل ذلك r == 2 ** 0.5. وبعد أسطورة لديها أن البيتثغوراس (من نظريته هذه الحقيقة هذه الحقيقة حتى ببساطة) كان لديه تلميذ هيباسوس قتل من أجل الجريمة الرهيبة لإثبات ذلك؛ يبدو أنك تعاطف مع رد الفعل المزعوم في الفطائر ؛-)، بالنظر إلى استخدامك الغريب ل "يجب".

من المفترض أن تكون كسور بيثون دقيقة، لذلك حتما حتمية هناك حالة ترفع جزءا كبيرا إلى قوة جزء آخر ستكون على الإطلاق غير قادر لإعادة الكسر كنتيجة لها؛ و "يجب" فقط لا يمكن تطبيقها بشكل معقول على استحالة رياضية.

لذلك أفضل ما يمكنك القيام به هو تقريبي النتيجة المرجوة الخاصة بك، على سبيل المثال عن طريق الحصول على نتيجة ليست جزءا كبيرا (يعتبر العوام عموما كافية للغرض) ثم تقريبه مرة أخرى مع الكسر. معظم تطبيقات Pure-Python الحالية (هناك عديدة rationals.py الملفات الموجودة حول الشبكة ؛-) أفضل عدم تنفيذ ** المشغل على الإطلاق، ولكن بالطبع لا يوجد شيء يمنعك من اتخاذ قرار تصميم مختلف في التنفيذ الخاص بك! -)

نصائح أخرى

يمكنك كتابة وظيفة "الأسرى" الخاصة بك للكسور التي لا تستخدم اللون العائم. هل هذا ما تحاول القيام به؟

سيؤدي ذلك إلى رفع جزءا كبيرا إلى قوة عدد صحيح مع العودة إلى تعويم.

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 )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top