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

履歴 編集

variable
<numbers>

std::numbers::inv_sqrt3(C++20)

namespace std::numbers {
  template <class T>
  inline constexpr T inv_sqrt3_v = unspecified;            // (1)

  template <floating_point T>
  inline constexpr T inv_sqrt3_v<T> = see below;           // (2)

  inline constexpr double inv_sqrt3 = inv_sqrt3_v<double>; // (3)
}

概要

3の平方根の逆数 (inverse square root 3) である1/√3を表す定数。

  • (1) : プライマリーテンプレート。これをインスタンス化するとプログラムは不適格となる
  • (2) : 任意の浮動小数点数型Tに対する定数定義。標準で定義される浮動小数点数型ごとの精度に応じた定数が定義される
  • (3) : double型に対する定数定義

備考

  • 1/√2を表すinv_sqrt2は定義されない。inv_sqrt2sqrt2/2もしくはsqrt2から指数を1引けば精度の低下なく簡単に求められるが、inv_sqrt3は簡単ではないため、標準ライブラリではinv_sqrt3のみが定義される
    #include <iostream>
    #include <numbers>
    #include <cmath>
    
    int main() {
      // 除算で 1/√2を求める
      constexpr double r1 = std::numbers::sqrt2 / 2;
      std::cout << r1 << std::endl; // 0.707107
    
      // sqrt2から指数を1引くことで 1/√2を求める
      int exp = 0;
      double fraction = std::frexp(std::numbers::sqrt2, &exp);
      double r2 = std::ldexp(fraction, exp - 1);
      std::cout << r2 << std::endl; // 0.707107
    }
    

#include <iostream>
#include <numbers>
#include <cmath>

int main()
{
  // double型定数
  double a = std::numbers::inv_sqrt3;
  std::cout << a << std::endl;

  // 任意の浮動小数点数型の定数
  float b = std::numbers::inv_sqrt3_v<float>;
  std::cout << b << std::endl;

  // 動的に計算する
  double c = 1.0 / std::sqrt(3.0);
  std::cout << c << std::endl;
}

出力

0.57735
0.57735
0.57735

バージョン

言語

  • C++20

処理系

参照