Intereting Posts
Запуск тестового примера PHPUnit Selenium программно («внутри PHP») PHP: получить идентификатор LINUX команды отправлять только полевые поля. если пустые, то не отправляйте по электронной почте. php для отправки по электронной почте Почему массив PHP изменяется, когда его элемент привязан к ссылке? быстрый способ найти значение min / max / avg в файле Как заставить Behat ждать вызова AJAX? Как я могу работать со отношениями «многие ко многим» в Yii2 Разделение логики / стиля в PHP должным образом Переключение с PHP! Ereg и! Eregi на preg_match Функция Codeigniter Mail отправляет почту в папку спама Как импортировать таблицу в phpmyadmin? Я получил ошибку размера файла Что вызывает ошибку PDO Не удается выполнить запросы, в то время как другие небуферизованные запросы активны? разность дат времени в php и mysql PHP / MySQL: лучшие методы работы / хранения денег? работают ли сеансы, когда файлы cookie отключены?

Вычисление N-го корня с помощью bcmath в PHP

Мы ищем N-й корень в PHP. Нам нужно сделать это с очень большим числом, и калькулятор окон вернется 2. С помощью следующего кода мы получаем 1. Кто-нибудь есть идея, как это работает?

echo bcpow(18446744073709551616, 1/64); 

Похоже, что PHP и BC lib имеют некоторые ограничения, и после поиска в Интернете я нашел эту интересную статью / код:

Поэтому вы должны использовать эту функцию:

 <?php function NRoot($num, $n) { if ($n<1) return 0; // we want positive exponents if ($num<=0) return 0; // we want positive numbers if ($num<2) return 1; // n-th root of 1 or 2 give 1 // g is our guess number $g=2; // while (g^n < num) g=g*2 while (bccomp(bcpow($g,$n),$num)==-1) { $g=bcmul($g,"2"); } // if (g^n==num) num is a power of 2, we're lucky, end of job if (bccomp(bcpow($g,$n),$num)==0) { return $g; } // if we're here num wasn't a power of 2 :( $og=$g; // og means original guess and here is our upper bound $g=bcdiv($g,"2"); // g is set to be our lower bound $step=bcdiv(bcsub($og,$g),"2"); // step is the half of upper bound - lower bound $g=bcadd($g,$step); // we start at lower bound + step , basically in the middle of our interval // while step!=1 while (bccomp($step,"1")==1) { $guess=bcpow($g,$n); $step=bcdiv($step,"2"); $comp=bccomp($guess,$num); // compare our guess with real number if ($comp==-1) { // if guess is lower we add the new step $g=bcadd($g,$step); } else if ($comp==1) { // if guess is higher we sub the new step $g=bcsub($g,$step); } else { // if guess is exactly the num we're done, we return the value return $g; } } // whatever happened, g is the closest guess we can make so return it return $g; } echo NRoot("18446744073709551616","64"); ?> 

Надеюсь, это было полезно …