スプレッドシートのGAMMALN.PRECISE関数の使い方|ガンマ関数対数

スポンサーリンク

「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関数の違いを整理しましょう。

項目GAMMALNGAMMALN.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.PRECISEln(Gamma(x)) を高精度に返す大きな値のオーバーフロー回避(高精度)
GAMMALNln(Gamma(x)) を返す大きな値のオーバーフロー回避(標準精度)
GAMMAGamma(x) を返す小数の階乗・統計分布の計算
LN自然対数 ln(x) を返す成長率・対数変換
EXPe^x を返すLN/GAMMALNの逆変換
FACTn! を返す整数の階乗(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との違い

項目ExcelGoogleスプレッドシート
構文=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) と同じ値になるはずです。

タイトルとURLをコピーしました