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

履歴 編集

function
<cmath>

# std::floor

    namespace std {
      float floor(float x);             // (1) C++03からC++20まで
      double floor(double x);           // (2) C++03からC++20まで
      long double floor(long double x); // (3) C++03からC++20まで

      constexpr floating-point-type
        floor(floating-point-type x);   // (4) C++23

      double
        floor(Integral x);              // (5) C++11
      constexpr double
        floor(Integral x);              // (5) C++23

      float
        floorf(float x);                // (6) C++17
      constexpr float
        floorf(float x);                // (6) C++23

      long double
        floorl(long double x);          // (7) C++17
      constexpr long double
        floorl(long double x);          // (7) C++23
    }

## 概要

引数 `x` 以下で最大の整数値を得る。（床関数）

- (1) : `float`に対するオーバーロード
- (2) : `double`に対するオーバーロード
- (3) : `long double`に対するオーバーロード
- (4) : 浮動小数点数型に対するオーバーロード
- (5) : 整数型に対するオーバーロード (`double`にキャストして計算される)
- (6) : `float`型規定
- (7) : `long double`型規定

## 戻り値

引数 `x` 以下で最大の整数値

## 備考

- 本関数は、C99 の規格にある `floor`（より正確には `math.h` ヘッダの `floor`、`floorf`、`floorl` の 3 つ。それぞれ C++ の `double`、`float`、`long double` バージョンに相当）と等価である。

- C++11 以降では、処理系が IEC 60559 に準拠している場合（`std::numeric_limits<T>::is_iec559() != false`）、以下の規定が追加される。

  - `x = ±0` の場合、`±0` を返す。
  - `x = ±∞` の場合、`±∞` を返す。

  また、本関数の挙動は、丸めモードが `FE_DOWNWARD` に設定されている時の `rint`、あるいは `nearbyint` のいずれかと等価である。
  したがって、本関数において戻り値が引数 `x` と異なる場合に例外 `FE_INEXACT` が発生するか否かは実装依存である。
  なお、本関数の挙動は、現在の丸めモードには依存しない。

- C++23では、(1), (2), (3)が(4)に統合され、拡張浮動小数点数型を含む浮動小数点数型へのオーバーロードとして定義された

## 例

    #include <cfenv>
    #include <cmath>
    #include <iostream>

    void test(double x)
    {
      std::feclearexcept(FE_ALL_EXCEPT);
      std::cout << "floor(" << x << ") = " << std::floor(x) << '\n';
      std::cout << "FE_INEXACT = " << std::boolalpha << (std::fetestexcept(FE_INEXACT) != 0) << "\n\n";
    }

    int main()
    {
      test(2.0);
      test(2.1);
      test(2.5);
      test(2.9);
      test(-2.0);
      test(-2.1);
      test(-2.5);
      test(-2.9);
    }

### 出力例

    floor(2) = 2
    FE_INEXACT = false

    floor(2.1) = 2
    FE_INEXACT = true

    floor(2.5) = 2
    FE_INEXACT = true

    floor(2.9) = 2
    FE_INEXACT = true

    floor(-2) = -2
    FE_INEXACT = false

    floor(-2.1) = -3
    FE_INEXACT = true

    floor(-2.5) = -3
    FE_INEXACT = true

    floor(-2.9) = -3
    FE_INEXACT = true

引数と結果が異なる場合に例外 `FE_INEXACT` が発生するか否かは実装によって異なる。

## 関連項目

- 天井関数 (正の無限への丸め) `ceil`
- 切り捨て (ゼロ方向への丸め) `trunc`

## 参照

- P0533R9 constexpr for `<cmath>` and `<cstdlib>`
  - C++23での、一部関数の`constexpr`対応
- P1467R9 Extended floating-point types and standard names
  - C++23で導入された拡張浮動小数点数型への対応として、`float`、`double`、`long double`のオーバーロードを`floating-point-type`のオーバーロードに統合し、拡張浮動小数点数型も扱えるようにした