2015-03-08 3 views
0

Мне нужно написать функцию мощности в Python, которая работает с реальным базовым и реальным показателем.Функция мощности для реального базового и реального экспонентов

а^б & & а, б ∈ R

Я застрял в этой точке:

def power_real_numbers(base, exp): 

    if isinstance(exp, int): 
     return power_bin_recursive(base, exp) 
    else: 
     integer = int(exp) 
     rational = int(str(exp).split('.')[1]) 

    #power_bin_recursive() works fine 
    intval = power_bin_recursive(base, integer) 
    ratval = math.sqrt(rational) 

    if exp == 0: 
     return 1 
    elif exp < 0: 
     val = intval/ratval 
    else: 
     val = intval * ratval 
    return val 

Это работает только с реальной базой, хотя. При действии exp числа отличаются, например:

7.5^2.5 = 154.046969298, output by power_real_numbers is 125.778823734 
7.5^0.5 = 2.73861278753, output by power_real_numbers is 2.2360679775 
7.5^-2.5 = 0.00649152660747, output by power_real_numbers is 0.00795046392 

Любая помощь приветствуется.

+1

вопрос, который приходит на ум, это "почему?" Какое понимание достигается, если вы не используете '**' operator –

+0

, самая худшая ошибка в вашем коде состоит в том, что рациональная часть для '2.5' равна' 5', а рациональная часть для '2.500000001' -' 500000001', не совсем какая вы ожидаете. –

+0

Итак, что случилось с '**' оператором? –

ответ

0

Для разделения целой и дробной части поплавка, используйте math.modf:

>>> import math 
>>> fractional, integer = math.modf(5.5) 
>>> fractional 
0.5 
>>> integer 
5.0 
0

Вы используете неправильные условия для расчета реального экспоненту. Ваши результаты подходят для вашего решения.

True: 7,5^2,5 = 154,046969298

Ваша программа: 7,5^2 * SQRT (5) = 125,778823734