C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のlrint()とllrint()関数の使い方を徹底解説

この記事では、C++で利用できる丸め処理用の関数である lrint()llrint() について詳しく解説します。まずは lrint() 関数から見ていきましょう。

lrint()関数とは

lrint() 関数は、引数として渡された小数値を、現在設定されている丸めモード(rounding mode)に従って整数値へ丸めるための関数です。丸めモードは fesetround() 関数を使って事前に指定できます。

fesetround() で指定できる主な丸め方向は以下のとおりです。

  • FE_DOWNWARD: 負の無限大方向へ丸める(切り下げ)
  • FE_UPWARD: 正の無限大方向へ丸める(切り上げ)
  • FE_TONEAREST: 最も近い値へ丸める(デフォルト)
  • FE_TOWARDZERO: ゼロ方向へ丸める(切り捨て)

lrint() 関数は、double型・float型・整数型のいずれの値も入力パラメータとして受け取ることができ、小数部を整数に丸めた結果を long int 型 として返します。

lrint()の使用例

#include <cfenv>
#include <cmath>
#include <iostream>
using namespace std;

int main() {
    int x = 40;
    long int res;

    // 丸め方向を「下方向(DOWNWARD)」に設定
    fesetround(FE_DOWNWARD);

    res = lrint(x);
    cout << "Downward rounding of " << x << " is " << res << endl;
    return 0;
}

出力結果

Downward rounding of 40.0235 is 40

この例では、丸め方向を下向きに設定しているため、40.0235のような小数値は40へと丸められます。

llrint()関数とは

llrint() 関数も、引数として渡された小数値を現在の丸めモードに従って整数値へ丸めるという点で lrint() と同様の動作をします。丸めモードの指定方法も同じく fesetround() を使用します。

両者の最大の違いは戻り値の型です。llrint() は丸め結果を long long int 型 として返します。そのため、より大きな範囲の数値を扱いたい場合には llrint() の方が適しています。

llrint()の使用例

#include <cfenv>
#include <cmath>
#include <iostream>
using namespace std;

int main() {
    double a;
    long long int res;

    // 丸め方向を「上方向(UPWARD)」に設定
    fesetround(FE_UPWARD);
    a = 40.3;
    res = llrint(a);
    cout << "Upward rounding of " << a << " is " << res << endl;

    // 丸め方向を「下方向(DOWNWARD)」に設定
    fesetround(FE_DOWNWARD);
    a = 40.88;
    res = llrint(a);
    cout << "Downward rounding of " << a << " is " << res << endl;

    return 0;
}

出力結果

Upward rounding of 40.3 is 41
Downward rounding of 40.88 is 40

この例では、最初に丸め方向を上向きに設定して40.3を丸めているため41となり、次に下向きに設定して40.88を丸めているため40となります。同じ値でも丸めモードによって結果が変わる点に注目してください。

まとめ

  • lrint():現在の丸めモードに従って小数を整数へ丸め、long int を返す
  • llrint():同様の丸め処理を行い、long long int を返す
  • 丸めモードは fesetround() で制御でき、切り上げ・切り下げ・最近接・ゼロ方向の4種類から選択可能
  • これらの関数を使用するには <cfenv><cmath> ヘッダーのインクルードが必要

浮動小数点数の丸め挙動を細かく制御したい場面では、通常の round() 関数ではなく、これらの関数と fesetround() を組み合わせることで柔軟な実装が可能になります。

  1. sin(x)とcos(x)の値を計算するC++プログラムの解説

    sin(x)とcos(x)の値を計算するC++プログラム 本記事では、角度を入力として受け取り、その角度に対応するsin(x)(正弦)とcos(x)(余弦)の値を計算して結果を表示するC++プログラムを解説します。ライブラリ関数に頼らず、テイラー展開(マクローリン展開)を用いて数値を近似する手法を紹介します。 sin(x)とは sin(x)は三角関数の一つで、角度xに対する正弦の値を求めるために使用されます。直角三角形では、斜辺に対する対辺の比として定義されます。 $$\sin (x) = \displaystyle\sum\limits_{k=0}^\infty \frac{(-1)^{k

  2. C++のインクリメント(++)とデクリメント(--)演算子の基礎と使い方

    インクリメント演算子とデクリメント演算子とはC++には、値を1だけ増減させるための便利な演算子が用意されています。インクリメント演算子「++」はオペランド(対象の値)に1を加え、デクリメント演算子「--」はオペランドから1を引きます。つまり、以下の2つのコードは同じ意味になります。x = x + 1; は x++; と同じ同様に、次の2つも同じ意味です。x = x - 1; は x--; と同じ前置き(prefix)と後置き(postfix)の違いインクリメント・デクリメント演算子には、オペランドの前に置く「前置き(prefix)」と、後ろに置く「後置き(postfix)」の2つの書き方があり