最終更新日時(UTC):
が更新

履歴 編集

function
<cmath>

std::beta(C++17)

namespace std {
  double
    beta(double x,
         double y);              // (1) C++17
  floating-point-type
    beta(floating-point-type x,
         floating-point-type y); // (1) C++23

  Promoted
    beta(Arithmetic1 x,
         Arithmetic2 y);         // (2) C++17

  float
    betaf(float x,
          float y);              // (3) C++17

  long double
    betal(long double x,
          long double y);        // (4) C++17
}

概要

ベータ関数 (beta function) を求める。

  • (1) :
    • C++17 : doubleに対するオーバーロード
    • C++23 : 浮動小数点数型に対するオーバーロード
  • (2) : 算術型に対するオーバーロード (対応する大きい方の精度の浮動小数点数型にキャストして計算される)
  • (3) : float型規定
  • (4) : long double型規定

戻り値

引数 x, y のベータ関数 $$ \mathrm{B}(x, y) = \int_0^1 \mathrm{d}t ~ t^{x-1} (1-t)^{y-1} = \frac{\Gamma(x) \Gamma(y)}{\Gamma(x + y)} \quad \text{for } x > 0, y > 0 $$ を返す。$\Gamma$ はガンマ関数 (tgamma)。

備考

#include <cmath>
#include <iostream>

int main() {
  std::cout << "beta(0, 0)      = " << std::beta(0, 0) << std::endl;      // 定義域エラー; 特異点
  std::cout << "beta(-0.5, 1.5) = " << std::beta(-0.5, 1.5) << std::endl; // 定義域エラー; 解析接続すれば -π
  std::cout << "beta(1, 1)      = " << std::beta(1, 1) << std::endl;      // 1
  std::cout << "beta(2, 4)      = " << std::beta(2, 4) << std::endl;      // 1 / 20
}

出力例

beta(0, 0)      = -nan
beta(-0.5, 1.5) = 3.14159
beta(1, 1)      = 1
beta(2, 4)      = 0.05

バージョン

言語

  • C++17

処理系

備考

GCC (libstdc++)

GCC 7.1.0–8.0.0 では betaexplgamma を用いて $ |\mathrm{B}(x, y)| = \exp(\ln |\Gamma(x) \Gamma(y) / \Gamma(x + y)|)) $ を計算する。 x < 0 || y < 0 でも定義域エラーを報告せずに値を返すが、戻り値は必ず正になる。

参照