名前空間
変種
操作

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

提供: cppreference.com
< cpp‎ | numeric‎ | math
 
 
数値演算ライブラリ
一般的な数学関数
特殊な数学関数 (C++17)
数学定数 (C++20)
浮動小数点環境 (C++11)
複素数
数値配列
擬似乱数生成
コンパイル時有理数算術 (C++11)
数値演算アルゴリズム
(C++17)
(C++17)
補間
(C++20)
(C++20)
汎用の数値演算
(C++11)
(C++17)
ビット操作
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
 
一般的な数学関数
関数
基本的な演算
(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)
 
ヘッダ <cmath> で定義
float       rint ( float arg );
float       rintf( float arg );
(1) (C++11以上)
double      rint ( double arg );
(2) (C++11以上)
long double rint ( long double arg );
long double rintl( long double arg );
(3) (C++11以上)
double      rint ( 整数型 arg );
(4) (C++11以上)
long lrint ( float arg );
long lrintf( float arg );
(5) (C++11以上)
long lrint ( double arg );
(6) (C++11以上)
long lrint ( long double arg );
long lrintl( long double arg );
(7) (C++11以上)
long lrint ( 整数型 arg );
(8) (C++11以上)
long long llrint ( float arg );
long long llrintf( float arg );
(9) (C++11以上)
long long llrint ( double arg );
(10) (C++11以上)
long long llrint ( long double arg );
long long llrintl( long double arg );
(11) (C++11以上)
long long llrint ( 整数型 arg );
(12) (C++11以上)
1-3) 現在の丸めモードを使用して、浮動小数点引数 arg を (浮動小数点形式の) 整数値に丸めます。
5-7, 9-11) 現在の丸めモードを使用して、浮動小数点引数 arg を整数値に丸めます。
4,8,12) 任意の整数型を受け取るオーバーロード集合または関数テンプレート。 それぞれ (2,6,10) と同等です (引数は double にキャストされます)。

目次

[編集] 引数

arg - 浮動小数点値

[編集] 戻り値

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

[編集] エラー処理

math_errhandling で規定されている通りにエラーが報告されます。

std::lrint または std::llrint の結果が戻り値の型で表現可能な範囲外の場合、定義域エラーまたは値域エラーが発生するかもしれません。

処理系が IEEE 浮動小数点算術 (IEC 60559) をサポートしている場合、

std::rint 関数については、
  • arg が ±∞ であれば、それが変更されずに返されます。
  • arg が ±0 であれば、それが変更されずに返されます。
  • arg が NaN であれば、 NaN が返されます。
std::lrint および std::llrint 関数については、
  • arg が ±∞ であれば、 FE_INVALID が発生し、処理系定義の値が返されます。
  • 丸めの結果が戻り値の型の範囲外であれば、 FE_INVALID が発生し、処理系定義の値が返されます。
  • arg が NaN であれば、 FE_INVALID が発生し、処理系定義の値が返されます。

[編集] ノート

POSIX は、 std::lrint または std::llrintFE_INEXACT を発生させるすべてのケースは定義域エラーであると規定しています

math_errhandling で規定されているように、非整数の有限な値を丸めるとき、 std::rint によって FE_INEXACT が発生するかもしれません (しかし非 IEEE な浮動小数点プラットフォームでは要求されません)。

std::rintstd::nearbyint の唯一の違いは、 std::nearbyintFE_INEXACT を発生させないことです。

すべての標準の浮動小数点フォーマットにおいて、最も大きな表現可能な浮動小数点値は正確な整数であるため、 std::rint それ自体はオーバーフローすることはありません。 しかし任意の整数型 (std::intmax_t も含みます) は、整数変数に格納するとき、結果がオーバーフローするかもしれません。

現在の丸めモードが…

[編集]

#include <iostream>
#include <cmath>
#include <cfenv>
#include <climits>
 
int main()
{
#pragma STDC FENV_ACCESS ON
    std::fesetround(FE_TONEAREST);
    std::cout << "rounding to nearest (halfway cases to even):\n"
              << "rint(+2.3) = " << std::rint(2.3)
              << "  rint(+2.5) = " << std::rint(2.5)
              << "  rint(+3.5) = " << std::rint(3.5) << '\n'
              << "rint(-2.3) = " << std::rint(-2.3)
              << "  rint(-2.5) = " << std::rint(-2.5)
              << "  rint(-3.5) = " << std::rint(-3.5) << '\n';
 
    std::fesetround(FE_DOWNWARD);
    std::cout << "rounding down:\n" 
              << "rint(+2.3) = " << std::rint(2.3)
              << "  rint(+2.5) = " << std::rint(2.5)
              << "  rint(+3.5) = " << std::rint(3.5) << '\n'
              << "rint(-2.3) = " << std::rint(-2.3)
              << "  rint(-2.5) = " << std::rint(-2.5)
              << "  rint(-3.5) = " << std::rint(-3.5) << '\n'
              << "rounding down with lrint\n" 
              << "lrint(+2.3) = " << std::lrint(2.3)
              << "  lrint(+2.5) = " << std::lrint(2.5)
              << "  lrint(+3.5) = " << std::lrint(3.5) << '\n'
              << "lrint(-2.3) = " << std::lrint(-2.3)
              << "  lrint(-2.5) = " << std::lrint(-2.5)
              << "  lrint(-3.5) = " << std::lrint(-3.5) << '\n';
 
    std::cout << "lrint(-0.0) = " << std::lrint(-0.0)  << '\n'
              << "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 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) = 3
rint(-2.3) = -3  rint(-2.5) = -3  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
lrint(-0.0) = 0
lrint(-Inf) = -9223372036854775808
std::rint(0.1) = 0
    FE_INEXACT was raised
std::lrint(LONG_MIN-2048.0) = -9223372036854775808
    FE_INVALID was raised

[編集] 関連項目

(C++11)(C++11)(C++11)
指定された値より絶対値が大きくない最も近い整数を返します
(関数) [edit]
(C++11)(C++11)(C++11)
現在の丸めモードを使用して最も近い整数に丸めます
(関数) [edit]
(C++11)(C++11)
丸め方向を取得または設定します
(関数) [edit]