📜  <cfloat>C C++中的float.h及其示例(1)

📅  最后修改于: 2023-12-03 14:38:55.708000             🧑  作者: Mango

C++中的float.h及其示例

在C++中,<cfloat>是一个头文件,提供了浮点类型的特定属性、函数、宏等内容。下面将介绍一些<cfloat>的基本内容和示例。

常量

<cfloat>中定义了一些常用的浮点常量,例如:

| 常量 | 描述 | 值 | |-------------|----------|------------------------| | FLT_RADIX | 浮点数的基数 | 2 | | FLT_EPSILON | 浮点数的最小精度 | 1.19209290e-07F | | FLT_DIG | 单精度浮点数的小数位数 | 6 | | FLT_MANT_DIG | 单精度浮点数的有效小数位数 | 24 | | FLT_MAX_EXP | 单精度浮点数的最大指数 | 128 | | FLT_MAX | 单精度浮点数的最大值 | 3.40282347e+38F | | FLT_MIN_EXP | 单精度浮点数的最小指数 | -125 | | FLT_MIN | 单精度浮点数的最小值 | 1.17549435e-38F | | DBL_DIG | 双精度浮点数的小数位数 | 15 | | DBL_MANT_DIG | 双精度浮点数的有效小数位数 | 53 | | DBL_MAX_EXP | 双精度浮点数的最大指数 | 1024 | | DBL_MAX | 双精度浮点数的最大值 | 1.79769313e+308 | | DBL_MIN_EXP | 双精度浮点数的最小指数 | -1021 | | DBL_MIN | 双精度浮点数的最小值 | 2.22507386e-308 | | LDBL_DIG | 扩展精度浮点数的小数位数 | 18 | | LDBL_MANT_DIG | 扩展精度浮点数的有效小数位数 | 64 | | LDBL_MAX_EXP | 扩展精度浮点数的最大指数 | 16384 | | LDBL_MAX | 扩展精度浮点数的最大值 | 1.18973149535723176502e+4932L | | LDBL_MIN_EXP | 扩展精度浮点数的最小指数 | -16381 | | LDBL_MIN | 扩展精度浮点数的最小值 | 3.36210314311209350626e-4932L |

宏定义

<cfloat>定义了一些宏,用于浮点类型的特定操作。

宏FLT_ROUNDS

FLT_ROUNDS宏将当前的舍入模式转换为一个整数值。它的返回值可能是以下三个之一:

| 舍入模式 | 值 | |:-------------|:----------| | 向0舍入 | 0 | | 向正无穷舍入 | 1 | | 向负无穷舍入 | -1 | | 取最接近值舍入 | 2 |

下面是一些示例:

#include <iostream>
#include <cfloat>

int main() {
    std::cout << "Round to zero: " << FLT_ROUNDS << '\n';
    std::cout << "9.5 rounds to: " << (int)(9.5f) << '\n';
    std::cout << "10.5 rounds to: " << (int)(10.5f) << '\n';
    std::cout << "-9.5 rounds to: " << (int)(-9.5f) << '\n';
    std::cout << "-10.5 rounds to: " << (int)(-10.5f) << '\n';
    return 0;
}

输出:

Round to zero: 0
9.5 rounds to: 9
10.5 rounds to: 10
-9.5 rounds to: -9
-10.5 rounds to: -10
宏FLT_EVAL_METHOD

FLT_EVAL_METHOD宏标识出实数计算时使用的评估精度方法。可能有以下三个取值:

| 取值 | 描述 | |--------|----------| | -1 | 使用内存中的最高精度 | | 0 | 使用和实数类型相同的精度 | | 1 | 使用和实数类型加上一位精度 |

下面是一个示例:

#include <iostream>
#include <cfloat>

int main() {
    std::cout << FLT_EVAL_METHOD << '\n';
    return 0;
}

输出:

0
函数

<cfloat>定义了一些函数,用于处理浮点类型。

函数fpclassify

fpclassify()判断传入的参数是何种浮点数,并返回一个标识该类型的值。可能返回以下值:

| 返回值 | 描述 | |--------|------------------------------| | FP_NAN | 参数是NaN(不是数字) | | FP_ZERO | 参数是零(包括-0.0) | | FP_INFINITE | 参数是无穷大(正负) | | FP_SUBNORMAL | 参数是一个被规约的(有损失精度的)非常小的值 | | FP_NORMAL | 参数是一个正常的浮点数 |

下面是一个示例:

#include <iostream>
#include <cfloat>
#include <cmath>

int main() {
    std::cout << std::fpclassify(1.0) << '\n';            // FP_NORMAL
    std::cout << std::fpclassify(0.0) << '\n';            // FP_ZERO
    std::cout << std::fpclassify(-1.0) << '\n';           // FP_NORMAL
    std::cout << std::fpclassify(-0.0) << '\n';           // FP_ZERO
    std::cout << std::fpclassify(std::sqrt(-1.0)) << '\n'; // FP_NAN
    std::cout << std::fpclassify(std::log(0.0)) << '\n';   // FP_INFINITE
    std::cout << std::fpclassify(1.175494351e-38F) << '\n';// FP_SUBNORMAL
    std::cout << std::fpclassify(3.4028236e+38F) << '\n';  // FP_NORMAL
    return 0;
}

输出:

2
4
2
4
1
1
3
2
函数isfinite、isinf、isnan、signbit

这几个函数都是用于判断一个浮点数的特定值的:

  • isfinite():返回true(一个确切的数字)或false(无穷大,无穷小或NaN)。
  • isinf():返回true(正无穷大或负无穷大)或false(一个确切的数字或NaN)。
  • isnan():返回true(NaN)或false(一个确切的数字,无穷大或无穷小)。
  • signbit():返回true(参数为负)或false(参数为非负)。

下面是一个示例:

#include <iostream>
#include <cfloat>
#include <cmath>

int main() {
    std::cout << std::isfinite(1) << std::endl;    // true
    std::cout << std::isfinite(1.0/0) << std::endl; // false
    std::cout << std::isinf(1.0/0) << std::endl;   // true
    std::cout << std::isnan(sqrt(-1.0)) << std::endl; // true
    std::cout << std::signbit(-1.0) << std::endl;    // true
    std::cout << std::signbit(1.0) << std::endl;     // false
    return 0;
}

输出:

1
0
1
1
1
0
结论

在C++中,<cfloat>是一个比较好用的头文件。范围非常广,提供了浮点类型的特定属性、函数、宏等内容。如果您经常使用浮点数,则<cfloat>应该是您的必备选择之一。