📅  最后修改于: 2023-12-03 14:38:55.708000             🧑  作者: Mango
在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
宏将当前的舍入模式转换为一个整数值。它的返回值可能是以下三个之一:
| 舍入模式 | 值 | |:-------------|:----------| | 向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
宏标识出实数计算时使用的评估精度方法。可能有以下三个取值:
| 取值 | 描述 | |--------|----------| | -1 | 使用内存中的最高精度 | | 0 | 使用和实数类型相同的精度 | | 1 | 使用和实数类型加上一位精度 |
下面是一个示例:
#include <iostream>
#include <cfloat>
int main() {
std::cout << FLT_EVAL_METHOD << '\n';
return 0;
}
输出:
0
<cfloat>
定义了一些函数,用于处理浮点类型。
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()
:返回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>
应该是您的必备选择之一。