Namespaces
Variants

std:: rint, std:: rintf, std:: rintl, std:: lrint, std:: lrintf, std:: lrintl, std:: llrint, std:: llrintf

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
rint lrint llrint
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
ヘッダーで定義 <cmath>
浮動小数点型への丸め
(1)
float rint ( float num ) ;

double rint ( double num ) ;

long double rint ( long double num ) ;
(C++11以降)
(C++23まで)
/* floating-point-type */ rint ( /* floating-point-type */ num ) ;
(C++23以降)
float rintf ( float num ) ;
(2) (C++11以降)
long double rintl ( long double num ) ;
(3) (C++11以降)
long への丸め
(4)
long lrint ( float num ) ;

long lrint ( double num ) ;

long lrint ( long double num ) ;
(C++11以降)
(C++23まで)
long lrint ( /* floating-point-type */ num ) ;
(C++23以降)
long lrintf ( float num ) ;
(5) (C++11以降)
long lrintl ( long double num ) ;
(6) (C++11以降)
long long への丸め処理
(7)
long long llrint ( float num ) ;

long long llrint ( double num ) ;

long long llrint ( long double num ) ;
(C++11以降)
(C++23まで)
long long llrint ( /* floating-point-type */ num ) ;
(C++23以降)
long long llrintf ( float num ) ;
(8) (C++11以降)
long long llrintl ( long double num ) ;
(9) (C++11以降)
<cmath> ヘッダーで定義
template < class Integer >
double rint ( Integer num ) ;
(A) (C++11以降)
template < class Integer >
long lrint ( Integer num ) ;
(B) (C++11以降)
template < class Integer >
long long llrint ( Integer num ) ;
(C) (C++11以降)
1-3) 浮動小数点引数 num を整数値(浮動小数点形式で)に丸めます。丸めには 現在の丸めモード を使用します。 ライブラリは、パラメータ num の型として、すべてのcv修飾されていない浮動小数点型に対する std::rint のオーバーロードを提供します。 (C++23以降)
4-9) 浮動小数点引数 num を、 現在の丸めモード を使用して整数値に丸めます。 ライブラリは、すべてのcv修飾されていない浮動小数点型をパラメータ num の型とする std::lrint および std::llrint のオーバーロードを提供します。 (C++23以降)
A-C) すべての整数型に対して追加のオーバーロードが提供されており、これらは double として扱われます。

目次

パラメータ

num - 浮動小数点または整数値

戻り値

エラーが発生しない場合、 num の現在の 丸めモード に従った最も近い整数値が返されます。

エラー処理

エラーは math_errhandling で指定された通りに報告されます。

std::lrint または std::llrint の結果が戻り値の型で表現可能な範囲外である場合、ドメインエラーまたはレンジエラーが発生する可能性があります。

IEEE浮動小数点演算(IEC 60559)を実装がサポートしている場合、

std::rint 関数について:
  • num が±∞の場合、変更されずに返されます。
  • num が±0の場合、変更されずに返されます。
  • num がNaNの場合、NaNが返されます。
std::lrint および std::llrint 関数について:
  • num が±∞の場合、 FE_INVALID が発生し、実装定義の値が返されます。
  • 丸め結果が戻り値の型の範囲外の場合、 FE_INVALID が発生し、実装定義の値が返されます。
  • num がNaNの場合、 FE_INVALID が発生し、実装定義の値が返されます。

注記

POSIXは std::lrint または std::llrint FE_INEXACT を発生させるすべての場合が定義域エラーであることを規定しています。

math_errhandling で規定されている通り、 FE_INEXACT は非整数の有限値を丸める際に std::rint によって発生する可能性があります(ただしIEEE浮動小数点プラットフォーム以外では必須ではありません)。

std::rint std::nearbyint の唯一の違いは、 std::nearbyint が決して FE_INEXACT を発生させないことです。

標準的な浮動小数点形式における最大表現可能な浮動小数点値はすべて正確な整数であるため、 std::rint 単体では決してオーバーフローを発生させない。しかしながら、結果が整数変数( std::intmax_t を含む)に格納される場合、あらゆる整数型でオーバーフローが発生する可能性がある。

現在の丸めモードが以下の場合:

追加のオーバーロードは (A-C) と完全に同一である必要はありません。これらは、整数型の引数 num に対して十分な保証を提供するだけで十分です:

  • std :: rint ( num ) std :: rint ( static_cast < double > ( num ) ) と同じ効果を持ちます。
  • std :: lrint ( num ) std :: lrint ( static_cast < double > ( num ) ) と同じ効果を持ちます。
  • std :: llrint ( num ) std :: llrint ( static_cast < double > ( num ) ) と同じ効果を持ちます。

#include <cfenv>
#include <climits>
#include <cmath>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::fesetround(FE_TONEAREST);
    std::cout << "最近接丸め(中間値は偶数方向):\n"
              << "  rint(+2.3) = " << std::rint(2.3) << '\n'
              << "  rint(+2.5) = " << std::rint(2.5) << '\n'
              << "  rint(+3.5) = " << std::rint(3.5) << '\n'
              << "  rint(-2.3) = " << std::rint(-2.3) << '\n'
              << "  rint(-2.5) = " << std::rint(-2.5) << '\n'
              << "  rint(-3.5) = " << std::rint(-3.5) << '\n';
    std::fesetround(FE_DOWNWARD);
    std::cout << "切り捨て:\n"
              << "  rint(+2.3) = " << std::rint(2.3) << '\n'
              << "  rint(+2.5) = " << std::rint(2.5) << '\n'
              << "  rint(+3.5) = " << std::rint(3.5) << '\n'
              << "  rint(-2.3) = " << std::rint(-2.3) << '\n'
              << "  rint(-2.5) = " << std::rint(-2.5) << '\n'
              << "  rint(-3.5) = " << std::rint(-3.5) << '\n'
              << "lrintによる切り捨て:\n"
              << "  lrint(+2.3) = " << std::lrint(2.3) << '\n'
              << "  lrint(+2.5) = " << std::lrint(2.5) << '\n'
              << "  lrint(+3.5) = " << std::lrint(3.5) << '\n'
              << "  lrint(-2.3) = " << std::lrint(-2.3) << '\n'
              << "  lrint(-2.5) = " << std::lrint(-2.5) << '\n'
              << "  lrint(-3.5) = " << std::lrint(-3.5) << '\n'
              << "特殊な値:\n"
              << "  lrint(-0.0) = " << std::lrint(-0.0) << '\n'
              << std::hex << std::showbase
              << "  lrint(-Inf) = " << std::lrint(-INFINITY) << '\n';
    // エラーハンドリング
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "std::rint(0.1) = " << std::rint(.1) << '\n';
    if (std::fetestexcept(FE_INEXACT))
        std::cout << "  FE_INEXACT が発生しました\n";
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "std::lrint(LONG_MIN-2048.0) = "
              << std::lrint(LONG_MIN - 2048.0) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "FE_INVALIDが発生しました\n";
}

出力例:

最近接丸め(中間値は偶数方向):
  rint(+2.3) = 2
  rint(+2.5) = 2
  rint(+3.5) = 4
  rint(-2.3) = -2
  rint(-2.5) = -2
  rint(-3.5) = -4
下方丸め:
  rint(+2.3) = 2
  rint(+2.5) = 2
  rint(+3.5) = 4
  rint(-2.3) = -2
  rint(-2.5) = -2
  rint(-3.5) = -4
lrintによる下方丸め:
  lrint(+2.3) = 2
  lrint(+2.5) = 2
  lrint(+3.5) = 3
  lrint(-2.3) = -3
  lrint(-2.5) = -3
  lrint(-3.5) = -4
特殊値:
  lrint(-0.0) = 0
  lrint(-Inf) = 0x8000000000000000
std::rint(0.1) = 0
std::lrint(LONG_MIN-2048.0) = 0x8000000000000000
  FE_INVALIDが発生

関連項目

(C++11) (C++11) (C++11)
指定された値の絶対値以下の最も近い整数
(関数)
(C++11) (C++11) (C++11)
現在の丸めモードを使用した最も近い整数
(関数)
(C++11) (C++11)
丸め方向の取得または設定
(関数)