C++教科書/標準ライブラリ編/<numbers>の章

編集

はじめに

編集

C++20から、数学的な定数を提供する<numbers>ヘッダーが導入されました。このヘッダーによって、プログラムに高精度な数値を簡単に利用できるようになりました。

名前空間 std::numbers

編集

<numbers>ヘッダーで定義されている数学的定数は、std::numbers名前空間の中に宣言されています。

テンプレート化された定数

編集

このヘッダーで提供される定数はテンプレート化されており、任意の浮動小数点型に対応しています。用意されている定数は以下の通りです。

  • e_v<T>: 自然対数の底e
  • log2e_v<T>: log2(e)の値
  • log10e_v<T>: log10(e)の値
  • pi_v<T>: 円周率πの値
  • inv_pi_v<T>: 1/πの値
  • inv_sqrtpi_v<T>: 1/√πの値
  • ln2_v<T>: log(2)の値
  • ln10_v<T>: log(10)の値
  • sqrt2_v<T>: √2の値
  • sqrt3_v<T>: √3の値
  • inv_sqrt3_v<T>: 1/√3の値
  • egamma_v<T>: オイラー定数γの値
  • phi_v<T>: 黄金比φの値

非テンプレート化された定数

編集

<numbers>ヘッダーでは、上記の定数に加えてdouble型の定数も提供されています。これらの定数は以下のように使用できます。

#include <numbers>

double expr = std::numbers::e * std::numbers::pi; // eπを計算

使用例

編集

高精度な値が必要な場合、<numbers>ヘッダーで提供される定数を使うとコードが簡潔になります。例えば以下のようにかけます。

#include <numbers>

// 三角比を計算する
template<typename T>
T sin_deg(T deg) {
    return std::sin(std::numbers::pi_v<T> * deg / 180);
}

まとめ

編集

<numbers>ヘッダーは、C++20から追加された標準ライブラリで、精度の高い数学定数を提供します。これらの定数は、単精度・倍精度だけでなく、任意の浮動小数点型に対応しています。高精度計算が必要な場合に、簡潔かつ正確なコードを書くのに役立ちます。さらに標準的な数学関数と組み合わせることで、様々な計算を正確に行えます。