2024 日本 PHP 研討會

bcpow

(PHP 4, PHP 5, PHP 7, PHP 8)

bcpow任意精度數的次方運算

說明

bcpow(字串 $num, 字串 $exponent, ?整數 $scale = null): 字串

計算 numexponent 次方。

參數

num

底數,以字串表示。

exponent

指數,以字串表示。必須是沒有小數部分的值。指數的有效範圍因平台而異,但至少介於 -21474836482147483647 之間。

scale
此參數用於設定結果中小數點後的小數位數。如果是 null,它將預設為使用 bcscale() 設定的預設小數位數,或 fallback 至 bcmath.scale INI 指令的值。

回傳值

以字串形式返回結果。

錯誤/例外

此函式在下列情況下會拋出 ValueError 例外:

  • numexponent 不是格式正確的 BCMath 數字字串
  • exponent 具有小數部分
  • exponentscale 超出有效範圍

如果 num0exponent 為負值,此函式會拋出 DivisionByZeroError 例外。

更新日誌

版本 說明
8.4.0 0 的負次方先前會返回 0,但現在會拋出 DivisionByZeroError 例外。
8.0.0 exponent 具有小數部分時,現在會拋出 ValueError 例外,而不是截斷小數部分。
7.3.0 bcpow() 現在會以要求的小數位數返回數字。以前,返回的數字可能會省略尾隨的小數零。

範例

範例 #1 bcpow() 範例

<?php

echo bcpow('4.2', '3', 2); // 74.08

?>

注意事項

注意:

在 PHP 7.3.0 之前,bcpow() 可能會返回小數點後位數少於 scale 參數所指示的結果。這種情況只會在結果不需要 scale 所允許的所有精度時發生。例如:

範例 #2 bcpow() scale 範例

<?php
echo bcpow('5', '2', 2); // 顯示 "25",而不是 "25.00"
?>

另請參閱

  • bcpowmod() - 計算任意精度數的次方,並以指定的模數進行約簡
  • bcsqrt() - 取得任意精度數的平方根

新增註解

使用者貢獻的註解 3 則註解

Michael Bailey (jinxidoru at byu dot net)
20 年前
bcpow() 只支援小於或等於 2^31-1 的指數。此外,bcpow() 不支援小數。如果將小數位數設定為 0,則指數會轉換為整數;否則會產生錯誤。

--
Michael Bailey
http://www.jinxidoru.com
thomas at tgohome dot com
15 年前
<?php

bcscale
(100);

/*
* 使用級數計算自然對數。
* @author Thomas Oldbury。
* @license 公共領域。
*/
function bcln($a, $iter = 10)
{
$result = "0.0";

for(
$i = 0; $i < $iter; $i++)
{
$pow = (1 + (2 * $i));
$mul = bcdiv("1.0", $pow);
$fraction = bcmul($mul, bcpow(bcsub($a, "1.0") / bcadd($a, "1.0"), $pow));
$result = bcadd($fraction, $result);
}

return
bcmul("2.0", $result);
}

/*
* 使用以 N 為底的對數計算以 2 為底的對數。
* @note 需要上述函式。
* @author Thomas Oldbury。
* @license 公共領域。
*/
function bclog2($a, $iter = 10)
{
return
bcdiv(bcln($a, $iter), bcln("2", $iter));
}

/*
* 使用以 N 為底的對數計算以 10 為底的對數。
* @note 需要上述函式。
* @author Thomas Oldbury。
* @license 公共領域。
*/
function bclog10($a, $iter = 10)
{
return
bcdiv(bcln($a, $iter), bcln("10", $iter));
}


?>
匿名
19 年前
如果 bcpow 有限制,那麼這個應該可以
<?php
function bcpow_($num, $power) {
$awnser = "1";
while (
$power) {
$awnser = bcmul($awnser, $num, 100);
$power = bcsub($power, "1");
}
return
rtrim($awnser, '0.');
}
?>
只是 $power 不能包含小數位數。
To Top