「GAMMALN.PRECISE関数って、GAMMALN関数と何が違うの?」
スプレッドシートでガンマ関数の自然対数を調べると、GAMMALN関数とGAMMALN.PRECISE関数の2つが見つかります。名前が似ていて、どちらを使えばいいか迷いますよね。
結論から言うと、GAMMALN.PRECISE関数はGAMMALN関数の「高精度版」です。Excel 2010で精度改善のために導入されました。
この記事では、GAMMALN.PRECISE関数の基本の書き方からGAMMALN関数との違い、実務での活用例まで紹介します。
スプレッドシートのGAMMALN.PRECISE関数とは?
GAMMALN.PRECISE関数(読み方: ガンマ・エルエヌ・プリサイス関数)は、ガンマ関数の自然対数 ln(Gamma(x)) を高精度に返す関数です。
「GAMMA」はガンマ関数、「LN」は自然対数(Natural Logarithm)、「PRECISE」は「精密な」という意味です。名前のとおり、GAMMALN関数の精度を向上させた関数ですね。
なぜ高精度版が必要だったのでしょうか。Excelの旧バージョン(Excel 2007以前)のGAMMALN関数には、特定の値で精度が低下する問題がありました。Excel 2010でこの問題を解消するために、GAMMALN.PRECISE関数が新設されたのです。
GAMMALN.PRECISE関数にできることをまとめると、次のとおりです。
- ガンマ関数の自然対数 ln(Gamma(x)) を高精度に計算する
- GAMMA関数がオーバーフローする大きな値でも安全に扱える
- 大きな数の階乗や組み合わせ計算の中間処理に使う
- 統計分布のパラメータ推定(最尤推定など)に活用する
NOTE
GAMMALN.PRECISE関数はGoogleスプレッドシートの全バージョンで使えます。Excelでは2010以降で対応しています。
GAMMALN.PRECISE関数の書き方(構文と引数)
基本構文
=GAMMALN.PRECISE(値)
カッコの中に「値(ガンマ関数の自然対数を求めたい正の数値)」を1つだけ入れます。
引数の説明
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 値 | 必須 | 正の実数を指定する。0以下を指定すると#NUM!エラーになる |
引数は1つだけなので、とてもシンプルです。GAMMALN関数とまったく同じ形式ですね。
GAMMALN.PRECISE関数の基本的な使い方
小さな数値で動作を確認する
まずは小さな数値で、GAMMALN.PRECISE関数の動作を確認してみましょう。
=GAMMALN.PRECISE(1)
結果は「0」です。Gamma(1) = 1 なので、ln(1) = 0 になります。
=GAMMALN.PRECISE(5)
結果は約「3.18」です。これは ln(Gamma(5)) = ln(24) = ln(4!) と同じ値です。
検算してみましょう。=LN(GAMMA(5)) も約「3.18」を返します。一致しますね。
=GAMMALN.PRECISE(0.5)
結果は約「0.57」です。Gamma(0.5) = sqrt(pi)(約1.77)なので、ln(1.77) は約 0.57 です。
大きな数値でオーバーフローを回避する
GAMMALN.PRECISE関数の真価は、大きな値を安全に扱えるところです。
=GAMMA(172)
この数式は#NUM!エラーになります。結果が大きすぎてスプレッドシートでは表現できません。
=GAMMALN.PRECISE(172)
こちらは約「711.71」を返します。エラーにならず計算できました。
さらに大きな値も問題ありません。
=GAMMALN.PRECISE(1000)
結果は約「5905.22」です。Gamma(1000) は10の2567乗を超える数値ですが、対数なら4桁に収まります。
セル参照を使う
A1に数値が入っているとします。
=GAMMALN.PRECISE(A1)
セル参照を使えば、値を変えるだけで結果が自動更新されます。
GAMMALN関数との違い
GAMMALN.PRECISE関数とGAMMALN関数の違いを整理しましょう。
| 項目 | GAMMALN | GAMMALN.PRECISE |
|---|---|---|
| 構文 | =GAMMALN(値) | =GAMMALN.PRECISE(値) |
| 戻り値 | ln(Gamma(x)) | ln(Gamma(x)) |
| 引数の範囲 | 正の実数のみ | 正の実数のみ |
| 精度 | 標準精度 | より高い数値精度 |
| Excel対応 | すべてのバージョン | Excel 2010以降 |
| 導入の経緯 | 初期から搭載 | 精度改善目的で追加 |
Googleスプレッドシートでは差がほぼゼロ
Googleスプレッドシートでは、両関数の計算精度に実用上の差はほぼありません。
=GAMMALN(100)
=GAMMALN.PRECISE(100)
どちらも約「359.13」を返します。小数点以下10桁以上を比較しても、同じ値です。
=GAMMALN(500)
=GAMMALN.PRECISE(500)
大きな値でも結果は同じです。どちらも約「2605.12」を返します。
なぜGAMMALN.PRECISEが存在するのか
Excel 2007以前のGAMMALN関数には、一部の値で精度が低下する問題がありました。Microsoftはこの問題に対して「既存関数を修正する」のではなく「高精度版を別関数として追加する」というアプローチを取りました。
これは下位互換性を保つための判断です。既存のGAMMALN関数を変更すると、過去のワークブックで計算結果が変わってしまいます。そのリスクを避けるために、GAMMALN.PRECISE関数が新設されました。
Googleスプレッドシートでは両方とも高精度で実装されています。そのため、どちらを使っても結果は変わりません。
どちらを使うべきか
結論としては、以下の基準で選んでください。
- 通常の用途: GAMMALN関数で問題ありません
- Excelファイルとの互換性重視: GAMMALN.PRECISE関数を使うと安心です
- Excel 2007以前との互換性: GAMMALN関数を使ってください(PRECISEは非対応)
GAMMALN.PRECISE関数の実践的な使い方・応用例
大きな数の組み合わせ(nCr)を安全に計算する
COMBIN関数は大きな数値でオーバーフローすることがあります。GAMMALN.PRECISEを使えば、対数の性質で安全に計算できます。
組み合わせの公式 nCr = n! / (r! x (n-r)!) を対数に変換すると、次のようになります。
=EXP(GAMMALN.PRECISE(n+1) - GAMMALN.PRECISE(r+1) - GAMMALN.PRECISE(n-r+1))
たとえば 200C100(200個から100個を選ぶ組み合わせ)を計算してみましょう。
=EXP(GAMMALN.PRECISE(201) - GAMMALN.PRECISE(101) - GAMMALN.PRECISE(101))
結果は約 9.05 x 10^58 です。COMBIN関数の結果と一致します。
TIP
対数の世界では「掛け算が足し算」「割り算が引き算」に変わります。GAMMALN.PRECISE関数はこの性質を活かして、巨大な数値の計算をシンプルにしてくれますよ。
対数尤度の計算に使う
統計学の最尤推定では、尤度関数の対数(対数尤度)を計算する場面があります。ガンマ分布のパラメータ推定がその典型例です。
ガンマ分布の対数尤度関数には ln(Gamma(alpha)) が含まれます。alphaが大きくなるとGamma(alpha)は天文学的な数値です。そのため、GAMMALN.PRECISE関数で直接 ln(Gamma(alpha)) を求めます。
=GAMMALN.PRECISE(A1)
A1に形状パラメータalphaの候補値を入れて、対数尤度を計算します。alphaを変化させて対数尤度が最大になる値を探す流れです。
EXP関数と組み合わせて元の値に戻す
GAMMALN.PRECISE関数の結果を元のガンマ関数値に戻したいときは、EXP関数を使います。
=EXP(GAMMALN.PRECISE(10))
結果は「362880」です。これは Gamma(10) = 9! = 362880 と一致します。
ただし、大きな値ではEXP関数自体がオーバーフローします。ln(Gamma(x)) の値が約709を超えると#NUM!エラーです。対数のまま計算を進めて、最後に必要な部分だけEXPで戻しましょう。
階乗の比を安全に計算する
大きな数の階乗の比(例: 100! / 50!)を直接計算すると、オーバーフローします。GAMMALN.PRECISEなら差分で安全に計算できます。
=EXP(GAMMALN.PRECISE(101) - GAMMALN.PRECISE(51))
この数式は 100! / 50! を計算しています。GAMMALN.PRECISE(n+1) = ln(n!) なので、引き算で割り算を表現できます。結果は約 3.07 x 10^73 です。
よくあるエラーと対処法
GAMMALN.PRECISE関数で発生しやすいエラーをまとめました。
| エラー | 原因 | 対処法 |
|---|---|---|
| #NUM! | 0以下の値を指定した | 正の数値(0より大きい値)を指定する |
| #VALUE! | 引数に文字列が入っている | セル参照先が数値かどうか確認する |
| #NAME? | 関数名の入力ミス | 「GAMMALN.PRECISE」のスペルを確認する |
0以下の値を指定したとき
GAMMALN.PRECISE関数は正の数値(0より大きい値)しか受け付けません。
=GAMMALN.PRECISE(0)
この数式は#NUM!エラーになります。負の数や0は指定できません。
GAMMA関数は負の小数(-0.5など)も計算できます。しかし、GAMMALN.PRECISE関数は対応していません。ln(Gamma(x)) は正の値のみで定義されるためです。
関数名のスペルミス
GAMMALN.PRECISE関数は名前が長く、スペルミスが起きやすい関数です。
=GAMMALNPRECISE(5)
ドット(.)を忘れると#NAME?エラーになります。必ず「GAMMALN.PRECISE」とドットを入れてください。
NOTE
Googleスプレッドシートでは関数名の入力中にサジェストが表示されます。「GAMMALN」まで入力すれば、候補にGAMMALN.PRECISEが出てくるので活用してください。
似た関数との違い・使い分け
| 関数 | 動作 | 用途 |
|---|---|---|
| GAMMALN.PRECISE | ln(Gamma(x)) を高精度に返す | 大きな値のオーバーフロー回避(高精度) |
| GAMMALN | ln(Gamma(x)) を返す | 大きな値のオーバーフロー回避(標準精度) |
| GAMMA | Gamma(x) を返す | 小数の階乗・統計分布の計算 |
| LN | 自然対数 ln(x) を返す | 成長率・対数変換 |
| EXP | e^x を返す | LN/GAMMALNの逆変換 |
| FACT | n! を返す | 整数の階乗(170まで) |
GAMMALN.PRECISEとGAMMAの関係
GAMMALN.PRECISE(x) = LN(GAMMA(x)) の関係です。GAMMA関数の結果に自然対数をかけた値を「1ステップで」返してくれます。
小さな値ならGAMMA関数で直接計算するほうがわかりやすいです。約172以上の大きな値ではGAMMA関数がオーバーフローします。そのときはGAMMALN.PRECISE関数に切り替えましょう。
GAMMALN.PRECISEとLNの組み合わせ
GAMMALN.PRECISE(x) と LN(GAMMA(x)) は数学的に同じです。ただし =LN(GAMMA(x)) と書くと、GAMMA(x)の計算段階でオーバーフローする可能性があります。GAMMALN.PRECISE関数なら内部で直接対数を計算するため安全です。
大きな値を扱うときは、必ず =GAMMALN.PRECISE(x) を使ってください。
Excelとの違い
| 項目 | Excel | Googleスプレッドシート |
|---|---|---|
| 構文 | =GAMMALN.PRECISE(数値) | =GAMMALN.PRECISE(値) |
| 動作 | ln(Gamma(x)) を返す | ln(Gamma(x)) を返す |
| 対応バージョン | Excel 2010以降 | 全バージョン |
| エラー時 | #NUM! / #VALUE! | #NUM! / #VALUE! / #NAME? |
| GAMMALNとの精度差 | 旧バージョンでは差あり | 差なし |
ExcelではGAMMALN.PRECISE関数はExcel 2010で導入されました。Excel 2007以前のファイルを開く場合、この関数は使えないので注意してください。
Googleスプレッドシートでは全バージョンで対応しています。ExcelファイルをGoogleスプレッドシートにインポートした場合も、そのまま動作します。
まとめ
GAMMALN.PRECISE関数は、ガンマ関数の自然対数 ln(Gamma(x)) を高精度に返す関数です。
ポイントを整理します。
- 構文は
=GAMMALN.PRECISE(値)の1引数。正の実数のみ対応 - GAMMALN関数の高精度版として、Excel 2010で導入された
- Googleスプレッドシートでは両関数の精度差はほぼゼロ
- 大きな数の組み合わせ計算には
=EXP(GAMMALN.PRECISE(n+1) - GAMMALN.PRECISE(r+1) - GAMMALN.PRECISE(n-r+1))が便利 - GAMMA関数が約172以上でオーバーフローする問題を回避できる
- 元のガンマ関数値に戻すにはEXP関数を使う
- Excelとの互換性を重視するならGAMMALN.PRECISEを選ぶと安心
まずは =GAMMALN.PRECISE(5) で「約3.18」が返ることを確認してみてください。=GAMMALN(5) と同じ値になるはずです。
