名前空間
変種
操作

rint, rintf, rintl, lrint, lrintf, lrintl, llrint, llrintf, llrintl

提供: cppreference.com
< c‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本操作
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数関数
(C99)
(C99)
(C99)
(C99)
冪関数
(C99)
(C99)
三角関数と双曲線関数
(C99)
(C99)
(C99)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
最も近い整数
(C99)(C99)(C99)
(C99)
rintlrintllrint
(C99)(C99)(C99)
浮動小数点操作関数
(C99)(C99)
(C99)
(C99)
分類
(C99)
(C99)
(C99)
(C99)(C99)
マクロ定数
 
ヘッダ <math.h> で定義
float rintf( float arg );
(1) (C99およびそれ以降)
double rint( double arg );
(2) (C99およびそれ以降)
long double rintl( long double arg );
(3) (C99およびそれ以降)
ヘッダ <tgmath.h> で定義
#define rint( arg )
(4) (C99およびそれ以降)
ヘッダ <math.h> で定義
long lrintf( float arg );
(5) (C99およびそれ以降)
long lrint( double arg );
(6) (C99およびそれ以降)
long lrintl( long double arg );
(7) (C99およびそれ以降)
ヘッダ <tgmath.h> で定義
#define lrint( arg )
(8) (C99およびそれ以降)
ヘッダ <math.h> で定義
long long llrintf( float arg );
(9) (C99およびそれ以降)
long long llrint( double arg );
(10) (C99およびそれ以降)
long long llrintl( long double arg );
(11) (C99およびそれ以降)
ヘッダ <tgmath.h> で定義
#define llrint( arg )
(12) (C99およびそれ以降)
1-3) 現在の丸めモードを使用して、浮動小数点引数 arg を浮動小数点形式の整数値に丸めます。
5-7, 9-11) 現在の丸めモードを使用して、浮動小数点引数 arg を整数形式の整数値に丸めます。
4,8,12) 型総称マクロ。 arglong double 型の場合はそれぞれ rintl, lrintl, llrintl が呼ばれます。 そうでなく、 arg が整数型または double 型の場合は rint, lrint, llrint が呼ばれます。 そうでなければ rintf, lrintf, llrintf が呼ばれます。

目次

[編集] 引数

arg - 浮動小数点値

[編集] 戻り値

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

[編集] エラー処理

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

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

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

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

[編集] ノート

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

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

rintnearbyint の唯一の違いは、 nearbyintFE_INEXACT を発生させないことです。

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

現在の丸めモードが…

  • FE_DOWNWARD の場合、 rintfloor と同等です。
  • FE_UPWARD の場合、 rintceil と同等です。
  • FE_TOWARDZERO の場合、 rinttrunc と同等です。
  • FE_TONEAREST の場合、 rint は中間の場合にゼロから離れる方向ではなく偶数に丸めるところが round と異なります。

[編集]

#include <stdio.h>
#include <math.h>
#include <fenv.h>
#include <limits.h>
 
int main(void)
{
#pragma STDC FENV_ACCESS ON
    fesetround(FE_TONEAREST);
    printf("rounding to nearest (halfway cases to even):\n"
           "rint(+2.3) = %+.1f  ", rint(2.3));
    printf("rint(+2.5) = %+.1f  ", rint(2.5));
    printf("rint(+3.5) = %+.1f\n", rint(3.5));
    printf("rint(-2.3) = %+.1f  ", rint(-2.3));
    printf("rint(-2.5) = %+.1f  ", rint(-2.5));
    printf("rint(-3.5) = %+.1f\n", rint(-3.5));
 
    fesetround(FE_DOWNWARD);
    printf("rounding down: \nrint(+2.3) = %+.1f  ", rint(2.3));
    printf("rint(+2.5) = %+.1f  ", rint(2.5));
    printf("rint(+3.5) = %+.1f\n", rint(3.5));
    printf("rint(-2.3) = %+.1f  ", rint(-2.3));
    printf("rint(-2.5) = %+.1f  ", rint(-2.5));
    printf("rint(-3.5) = %+.1f\n", rint(-3.5));
    printf("rounding down with lrint: \nlrint(+2.3) = %ld  ", lrint(2.3));
    printf("lrint(+2.5) = %ld  ", lrint(2.5));
    printf("lrint(+3.5) = %ld\n", lrint(3.5));
    printf("lrint(-2.3) = %ld  ", lrint(-2.3));
    printf("lrint(-2.5) = %ld  ", lrint(-2.5));
    printf("lrint(-3.5) = %ld\n", lrint(-3.5));
 
    printf("lrint(-0.0) = %ld\n", lrint(-0.0));
    printf("lrint(-Inf) = %ld\n", lrint(-INFINITY)); // FE_INVALID raised
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("rint(1.1) = %.1f\n", rint(1.1));
    if(fetestexcept(FE_INEXACT)) puts("    FE_INEXACT was raised");
 
    feclearexcept(FE_ALL_EXCEPT);
    printf("lrint(LONG_MIN-2048.0) = %ld\n", lrint(LONG_MIN-2048.0));
    if(fetestexcept(FE_INVALID)) puts("    FE_INVALID was raised");
}

出力例:

rounding to nearest (halfway cases to even):
rint(+2.3) = +2.0  rint(+2.5) = +2.0  rint(+3.5) = +4.0
rint(-2.3) = -2.0  rint(-2.5) = -2.0  rint(-3.5) = -4.0
rounding down: 
rint(+2.3) = +2.0  rint(+2.5) = +2.0  rint(+3.5) = +3.0
rint(-2.3) = -3.0  rint(-2.5) = -3.0  rint(-3.5) = -4.0
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
rint(1.1) = 1.0
    FE_INEXACT was raised
lrint(LONG_MIN-2048.0) = -9223372036854775808
    FE_INVALID was raised

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.12.9.4 The rint functions (p: 252)
  • 7.12.9.5 The lrint and llrint functions (p: 252)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.6.4 The rint functions (p: 527)
  • F.10.6.5 The lrint and llrint functions (p: 527)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12.9.4 The rint functions (p: 232-233)
  • 7.12.9.5 The lrint and llrint functions (p: 233)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.6.4 The rint functions (p: 463)
  • F.9.6.5 The lrint and llrint functions (p: 463)

[編集] 関連項目

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