- カテゴリ: PHP
- 掲載バージョン: PHP 8.4
- 名前空間 / FQCN / コマンド:
pow(int|float $num, int|float $exponent): int|float - 関連:
**(累乗演算子),bcpow,gmp_pow,sqrt,abs - 変更履歴: PHP 5.6 で
**演算子追加/PHP 8.0 でシグネチャに union types 明記
要点(TL;DR)
- 数値の累乗を計算する関数
pow(2, 10)→1024- 罠: ① 負の底 × 非整数指数は
NAN、② 大きな整数は浮動小数へ丸め・桁落ち、③ 極大/極小はINF/0.0
概要
pow() は底 $num を指数 $exponent で累乗した結果を返します。整数・浮動小数のどちらにも対応し、指数が負なら 1/… を返します。大きな値では浮動小数へフォールバックし精度を失うため、厳密な多倍長整数は bcmath/gmp を利用します。
構文 / シグネチャ
pow(int|float $num, int|float $exponent): int|float
- 引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| $num | int|float | はい | — | 底(base) |
| $exponent | int|float | はい | — | 指数(power)。負や小数も可 |
- 戻り値:
int|float(結果が int に収まらない場合は float) - 例外/副作用:
- 非数値(配列/オブジェクトなど)で
TypeError - 負の底 × 非整数指数は
NAN(例:pow(-2, 2.5)) - オーバーフローで
INF、アンダーフローで0.0
- 非数値(配列/オブジェクトなど)で
使用例
最小例
<?php
declare(strict_types=1);
echo pow(2, 10), PHP_EOL; // 1024
echo pow(10, -2), PHP_EOL; // 0.01
echo pow(-3, 3), PHP_EOL; // -27
echo pow(0, 0), PHP_EOL; // 1(PHPの仕様)
実務例(複利計算)
<?php
declare(strict_types=1);
/**
* 年率 r で n 年複利運用した元利合計
*/
function compound(float $principal, float $rate, int $years): float {
// (1 + r)^n
return $principal * pow(1 + $rate, $years);
}
try {
$total = compound(1_000_000, 0.03, 5); // 100万円, 3%, 5年
echo number_format($total, 2, '.', ','), PHP_EOL; // 1,159,274.07
} catch (Throwable $e) {
// 例外が来るのは型不正など。計算時のINF/NANは別途チェック。
echo "Error: {$e->getMessage()}";
}
よくある落とし穴・注意
- 負の底 × 非整数指数:
NAN。ルート計算などは事前に条件分岐。 - 精度:大きな整数や小数の高い指数は float 化・桁落ち。厳密計算は
bcpow/gmp_pow。 0 ** 0/pow(0,0):PHP は1を返す。数学的に議論がある点を把握。- 演算子との違い:
$a ** $bは構文糖。可読性・パフォーマンス面で通常はこちらを推奨。
代替・関連APIとの比較
**(演算子):pow($a,$b)より可読・高速。通常はこちら。bcpow(BCMath):任意精度の10進演算。金額/桁厳密用途に最適。要ext-bcmath。gmp_pow(GMP):巨大整数の高速演算に強い。要ext-gmp。sqrt:平方根専用で速い・簡潔。pow($x, 0.5)より可読。
選定基準
- 可読・一般用途…
** - 桁厳密(通貨/会計)…
bcpow - 超巨大整数…
gmp_pow
テスト例(Pest)
<?php
it('calculates power correctly', function () {
expect(pow(2, 10))->toBe(1024);
expect(pow(10, -2))->toBeFloat()->toBeCloseTo(0.01, 10);
expect(pow(-3, 3))->toBe(-27);
expect(pow(-2, 2.5))->toBe(NAN); // 負×非整数指数はNAN
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
| `TypeError: pow(): Argument #1 must be of type int | float` | 配列/オブジェクト等の非数値を渡した |
結果が INF | オーバーフロー | 入力を制限、is_infinite() で検知、任意精度へ切替 |
結果が NAN | 負の底 × 非整数指数 | 事前に条件分岐。実数範囲外であることを明示 |
| 桁落ち・丸め誤差 | float へのフォールバック | bcpow/gmp_pow を使用。必要に応じて丸め方針を統一 |

