名前空間
変種
操作

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

From cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
(C++11)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指数関数
(C++11)
(C++11)

(C++11)
(C++11)
べき乗関数
(C++11)
(C++11)
三角関数と
双曲線関数
(C++11)
(C++11)
(C++11)

誤差関数とガンマ関数
(C++11)
(C++11)
(C++11)
(C++11)
最近接整数への浮動小数点数操作
(C++11)(C++11)(C++11)
(C++11)
(C++11)
rintlrintllrint
(C++11)(C++11)(C++11)
浮動小数点数の操作関数
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
分類と比較
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
マクロ定数
分類
(C++11)(C++11)(C++11)(C++11)(C++11)


 
ヘッダー <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 のオーバーロードを提供します。(since C++23)
4-9) 浮動小数点引数 num を、現在の丸めモードを使用して、整数値に丸めます。ライブラリは、パラメータ num の型として、すべての cv-修飾されていない浮動小数点型に対する std::lrint および std::llrint のオーバーロードを提供します。(since C++23)
A-C) すべての整数型に対する追加のオーバーロードが提供されており、これらは double として扱われます。

目次

[編集] Parameters

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

[編集] Return value

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

[編集] Error handling

エラーは 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 が発生し、実装定義の値が返されます。

[編集] Notes

POSIX は、std::lrint または std::llrintFE_INEXACT を発生させるすべてのケースがドメインエラーであると規定しています。

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

std::rintstd::nearbyint の唯一の違いは、std::nearbyintFE_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)) と同じ効果を持ちます。

[編集] Example

#include <cfenv>
#include <climits>
#include <cmath>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
 
int main()
{
    std::fesetround(FE_TONEAREST);
    std::cout << "Rounding to nearest (halfway cases to even):\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 << "Rounding down:\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'
              << "Rounding down with 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'
              << "Special values:\n"
              << "  lrint(-0.0) = " << std::lrint(-0.0) << '\n'
              << std::hex << std::showbase
              << "  lrint(-Inf) = " << std::lrint(-INFINITY) << '\n';
 
    // error handling
    std::feclearexcept(FE_ALL_EXCEPT);
 
    std::cout << "std::rint(0.1) = " << std::rint(.1) << '\n';
    if (std::fetestexcept(FE_INEXACT))
        std::cout << "  FE_INEXACT was raised\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 was raised\n";
}

実行結果の例

Rounding to nearest (halfway cases to even):
  rint(+2.3) = 2
  rint(+2.5) = 2
  rint(+3.5) = 4
  rint(-2.3) = -2
  rint(-2.5) = -2
  rint(-3.5) = -4
Rounding down:
  rint(+2.3) = 2
  rint(+2.5) = 2
  rint(+3.5) = 4
  rint(-2.3) = -2
  rint(-2.5) = -2
  rint(-3.5) = -4
Rounding down with 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
Special values:
  lrint(-0.0) = 0
  lrint(-Inf) = 0x8000000000000000
std::rint(0.1) = 0
std::lrint(LONG_MIN-2048.0) = 0x8000000000000000
  FE_INVALID was raised

[編集] See also

(C++11)(C++11)(C++11)
与えられた値の絶対値以下の最大の整数
(関数) [編集]
(C++11)(C++11)(C++11)
現在の丸めモードを使用して最近接整数を求める
(関数) [編集]
(C++11)(C++11)
丸め方向を取得または設定する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)