📜  C++ 中的 rint()、fesetround()、rintf()、rintl()(1)

📅  最后修改于: 2023-12-03 15:13:58.523000             🧑  作者: Mango

C++ 中的 rint()、fesetround()、rintf()、rintl()

在C++中,有许多用于舍入浮点数的函数,其中 rint()fesetround()rintf()rintl() 都是非常有用的。

rint()

rint() 是一个标准库函数,用于四舍五入到最接近的整数。该函数的参数可以是任何可转换为 double 类型的整数或浮点数。

#include <cmath>
#include <iostream>

int main() {
    double a = 5.5;
    double b = 5.49;
    double c = -5.5;
    double d = -5.49;

    std::cout << std::round(a) << std::endl;
    std::cout << std::round(b) << std::endl;
    std::cout << std::round(c) << std::endl;
    std::cout << std::round(d) << std::endl;

    return 0;
}

输出:

6
5
-6
-5
fesetround()

fesetround() 函数用于设置舍入方式。默认情况下,C++会使用 FE_TONEAREST 舍入方式,这意味着如果值恰好位于两个整数之间,则会进行四舍五入。但是,fesetround() 函数允许您选择其他舍入方式,包括:

  • FE_UPWARD:向正无穷舍入。
  • FE_DOWNWARD:向负无穷舍入。
  • FE_TOWARDZERO:向零舍入。
  • FE_TONEAREST:最接近(默认)。
#include <cmath>
#include <iostream>
#include <cfenv>

int main() {
    double a = 5.5;
    double b = 5.49;
    double c = -5.5;
    double d = -5.49;

    std::cout << std::round(a) << std::endl;
    fesetround(FE_UPWARD); // 设置舍入方式为向上。
    std::cout << std::round(a) << std::endl;
    fesetround(FE_DOWNWARD); // 设置舍入方式为向下。
    std::cout << std::round(a) << std::endl;
    fesetround(FE_TOWARDZERO); // 设置舍入方式为向零。
    std::cout << std::round(a) << std::endl;
    fesetround(FE_TONEAREST); // 设置舍入方式为四舍五入。
    std::cout << std::round(a) << std::endl;

    return 0;
}

输出:

6
6
5
5
6
rintf()

rintf()rint() 的浮点版本。

#include <cmath>
#include <iostream>

int main() {
    float a = 5.5;
    float b = 5.49;
    float c = -5.5;
    float d = -5.49;

    std::cout << std::round(a) << std::endl;
    std::cout << std::round(b) << std::endl;
    std::cout << std::round(c) << std::endl;
    std::cout << std::round(d) << std::endl;

    return 0;
}

输出:

6
5
-6
-5
rintl()

rintl()rint() 的长整型版本。

#include <cmath>
#include <iostream>

int main() {
    long double a = 5.5;
    long double b = 5.49;
    long double c = -5.5;
    long double d = -5.49;

    std::cout << std::round(a) << std::endl;
    std::cout << std::round(b) << std::endl;
    std::cout << std::round(c) << std::endl;
    std::cout << std::round(d) << std::endl;

    return 0;
}

输出:

6
5
-6
-5

可以看出,rint()rintf()rintl() 都是用于舍入浮点数的非常有用的函数。fesetround() 函数允许您选择不同的舍入方式。这些函数组合使用可以方便地处理浮点数舍入问题。