Программирование > PHP
pow() и bcpow() не катят
Orme:
andymc
--- Цитировать ---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);
}
}
--- Конец цитаты ---
Не будет работать. Нужна формула (ln(a) * a^X)*x + a^X.
В ней тоже много проблем, которые стандартными способами не решишь.
andymc:
Я сам проверял, работает нормально
--- Цитировать ---bcpow(a, m) = bcpow(a, m1) * pow(a, m2)
--- Конец цитаты ---
это формула школьного курса, переделанная под php (\'a\' в степени \'c\'+\'b\' = \'a\' в степени \'c\' умножить на \'a\' в степени \'b\')
Логически елси подумать, это должно работать
Orme:
m2 - все равно дробь. Смысл какой?
Нужно привести в итоге к целочисленным вычислениям.
Тут надо переводить decimal в fraction (типа 1/2, 5/4)
Далее по формуле a^m/n = n-ный корень из a^m
andymc:
m2 - дробь, но pow() же работает с дробями. Смысл в том, чтобы разделить задачу на 2 части: отдельно считать целое и дробное.
--- Цитировать ---переводить decimal в fraction (типа 1/2, 5/4)
--- Конец цитаты ---
что-то мне кажется, что это невозможно
--- Цитировать ---a^m/n = n-ный корень из a^m
--- Конец цитаты ---
я сначала тоже так думал, только вот n-ный корень ты не сможешь точно подсчитать:
pow() ограничена
bcpow() не работает с дробями
ты функцию проверял? Она работает?
Orme:
--- Цитировать --- что-то мне кажется, что это невозможно
--- Конец цитаты ---
- очень даже несложная функция:
function dec2frac($decimal) {
$decimal = (string)$decimal;
$num = "";
$den = "1";
$dec = false;
for ($i = 0, $len = strlen($decimal); $i < $len; $i++) {
if ($dec) $den = gmp_mul($den, "10");
if ($decimal{$i} == ".") {
$dec = true;
}else{
$num .= $decimal{$i};
}
}
if($den == "1") return $num;
if (strpos($num, "0") === 0) $num = ltrim($num, "0");
$gcd = gmp_gcd($num, $den);
$num = gmp_strval(gmp_div($num, $gcd));
$den = gmp_strval(gmp_div($den, $gcd));
return $num."/".$den;
}
Навигация
Перейти к полной версии