最終更新日時: 2025年07月14日 23時04分00秒 (JST)
Koichi Murase が更新

履歴 編集

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_sqrt2`は`sqrt2/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

### 処理系

- Clang:
- GCC: 10.1 ✅
- Visual C++: ??

## 参照

- Why isn't inv_sqrt2 defined in the C++ standard library? - Stackoverflow