Программирование > PHP

pow() и bcpow() не катят

(1/3) > >>

Orme:
Нужна функция или алгоритм, возводящие число в степень.

Возвращаемое значение и передаваемые аргументы могут быть очень большими,
поэтому pow() не подходит.
bcpow() тоже не подходит, потому что в качестве аргументов принимает
только натуральные числа, а нужно, чтобы принимала любые положительные,
в том числе и дробные, и меньше 1.
//
строка большое_число mypow ( строка большое_число, строка степень_любое_полож_число )

Может, кто-нибудь сталкивался с аналогичной проблемой, и может помочь?

-----
Да, gmp_pow() воспользоваться не могу, потому что работаю под win32.
    И может с ней аналогичная ситуация.

andymc:
Orme
Объясни, почему pow() не подходит?
Большое число - насколько большое: 1000, миллион, миллиард?

CGVictor:
[off]andymc
Максимальный вывод у pow - 2^31.[/off]

andymc:
CGVictor, Orme
[OFF]Эксперимент показал, что максимальная степень по базе \'2\' - это 39 (pow(2,39))
pow(2,39) = 549 755 813 888
pow(2,40) = 1.099 511 627 78E+012
Дальше идёт округление
Функци bcpow() действительно не считает дробные степени.[/OFF]

Пусть m - степень (дробная). например, 25,86
Тогда m1 = floor(m); // целая часть 25
m2 = m - m1; // дробная часть 0,86
Теперь, согласно форумуле
bcpow(a, m) = bcpow(a, m1) * pow(a, m2);

Готовая функция может выглядеть так:
function mypow($x, $y, $scale = 0){
if (is_float($y)){
$y1 = floor($y);
$y2 = $y - $y1;
return bcmul(bcpow($x, $y1), pow($x, $y2), $scale);
} else {
return bcpow($x, $y);
}
}

Orme:
andymc

--- Цитировать ---bcpow(a, m) = bcpow(a, m1) * pow(a, m2)
--- Конец цитаты ---


Откуда формула?

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии