pow — 累乗を計算する

PHP
  • カテゴリ: 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
  • 引数(表)
引数必須既定値説明
$numint|floatはい底(base)
$exponentint|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 intfloat`配列/オブジェクト等の非数値を渡した
結果が INFオーバーフロー入力を制限、is_infinite() で検知、任意精度へ切替
結果が NAN負の底 × 非整数指数事前に条件分岐。実数範囲外であることを明示
桁落ち・丸め誤差float へのフォールバックbcpow/gmp_pow を使用。必要に応じて丸め方針を統一

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする