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

C++のrint()・rintf()・rintl()関数で浮動小数点数を丸める方法

本記事では、C++で浮動小数点数を丸めるために使用される3つの関数、rint()rintf()rintl()について解説します。これらの関数は、現在設定されている丸めモードに従って、浮動小数点値を最も近い整数値へ丸めた結果を返します。

rint()関数とは

rint()関数は、浮動小数点値を整数値に丸めるための関数です。構文は以下のとおりです。計算結果が戻り値の型の表現範囲外となる場合には、定義域エラー(domain error)が発生する可能性があります。また、引数が0または無限大の場合は、その値がそのまま返されます。

float rint(float argument)
double rint(double argument)
long double rint(long double argument)

サンプルコード

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

int main() {
    double a, b, x, y;
    x = 53.26;
    y = 53.86;
    a = rint(x);
    b = rint(y);
    cout << "aの値: " << a << endl;
    cout << "bの値: " << b;
}

実行結果

aの値: 53
bの値: 54

53.26は最も近い整数の53に、53.86は54に丸められていることがわかります。

rintf()関数とは

rintf()関数はrint()関数とほぼ同じ働きをしますが、引数と戻り値の型がすべてfloat型である点が異なります。次の例では、<cfenv>ヘッダー(C言語では<fenv.h>)で提供されるfesetround()関数を使用して、丸めモードを明示的に指定しています。

float rintf(float argument)

サンプルコード

#include <cmath>
#include <fenv.h>
#include <iostream>
using namespace std;

int main() {
    double a, b, x, y;
    x = 53.26;
    y = 53.86;
    fesetround(FE_UPWARD);   // 切り上げモードに設定
    a = rintf(x);
    fesetround(FE_DOWNWARD); // 切り下げモードに設定
    b = rintf(y);
    cout << "aの値: " << a << endl;
    cout << "bの値: " << b;
}

実行結果

aの値: 54
bの値: 53

FE_UPWARD(切り上げ)モードでは53.26が54に、FE_DOWNWARD(切り下げ)モードでは53.86が53に丸められています。このように、fesetround()を使うことで丸めの方向を自由に制御できます。

rintl()関数とは

rintl()関数もrint()関数と同様ですが、引数と戻り値の型がすべてlong double型である点が異なります。より高い精度が必要な大きな数値を扱う場合に適しています。こちらの例でもfesetround()関数を使用して丸めモードを指定します。

long double rintl(long double argument)

サンプルコード

#include <cmath>
#include <fenv.h>
#include <iostream>
using namespace std;

int main() {
    long double a, b, x, y;
    x = 53547.55555555555L;
    y = 53547.55555555523L;
    fesetround(FE_UPWARD);   // 切り上げモードに設定
    a = rintl(x);
    fesetround(FE_DOWNWARD); // 切り下げモードに設定
    b = rintl(y);
    cout << "aの値: " << a << endl;
    cout << "bの値: " << b;
}

実行結果

aの値: 53548
bの値: 53547

まとめ

rint()、rintf()、rintl()は、それぞれdouble型、float型、long double型に対応した丸め関数です。いずれもfesetround()で設定した丸めモード(FE_UPWARD、FE_DOWNWARDなど)に従って動作するため、単純な四捨五入だけでなく、切り上げや切り下げといった柔軟な丸め処理を実現できます。用途に応じて適切な型の関数を選択しましょう。

  1. C++のexpm1()関数とは?使い方とコード例を解説

    expm1()関数は、自然対数の底eを任意の数で累乗した値から1を引いた結果を計算するために使用される数学関数です。つまり、(e^a) - 1 の値を返します。 expm1()の数学的な表現は以下の通りです。 expm1(a) = (e^a) - 1 なお、xが非常に小さい値の場合、e^xは1に近づくため、通常の方法(exp(x) - 1)で計算すると桁落ちによって精度が低下します。expm1()関数を使うことで、このようなケースでも高精度な結果を得ることができます。 C++におけるexpm1()関数の構文は以下の通りです。 float expm1(variable_name); 各要素の意

  2. C++のlog1p()関数とは?使い方とサンプルコードをわかりやすく解説

    C++のlog1p()関数の概要C++のlog1p()関数は、任意の数値 a に対して「(a + 1) の自然対数(底が e の対数)」を計算するための関数です。戻り値として (a+1) の自然対数の値が返されます。なお、引数に -1 未満の値 を渡した場合は、有効な結果が得られないため NaN(Not a Number) が返される点に注意が必要です。数学的な表現log1p() の動作は、次の数式で表すことができます。log1p(a) = base-e log(a+1)log1p()の構文C++における log1p() 関数の構文は以下のとおりです。float log1p(float var