Программирование > PHP
pow() и bcpow() не катят
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)
--- Конец цитаты ---
Откуда формула?
Навигация
Перейти к полной версии