本位主要介绍C++中float类型,如何判断是否为0
在C++中,float
和double
类型的变量不能直接判断是否为空。这是因为浮点数类型的变量可以包含很小或很大的值,并且有特殊的取值比如NaN(非数字)和无穷大(Infinity);
可以使用以下方法进行判断
1.初始化变量
在定义浮点数类型的变量时,可以将其初始化为特定的值,例如0或一个特殊的标识值,表示该变量为空。然后在后续的代码中,可以检查变量是否仍然具有该初始值,以确定变量是否为空;
float myFloat = 0.0;
double myDouble = 0.0;
// 判断浮点数是否为空
if (myFloat == 0.0 && myDouble == 0.0) {
// 变量为空
} else {
// 变量不为空
}
请注意,这种方法只适用于特定的初始化值,并且在后续代码中如果有其他地方会将变量修改为相同的初始值,判断结果可能会失效。
2. 根据范围进行判断
2.1 自定义范围
通过判断浮点数变量的值是否在一个指定的范围内,来确定变量是否为空;这个范围可以是一个特定的区间,如大于某个最小值并且小于某个最大值。
float myFloat = getValue(); // 获取浮点数值
double myDouble = getValue(); // 获取浮点数值
// 判断浮点数float是否为空
if (myFloat > minValue && myFloat < maxValue) {
// 变量为空
} else {
// 变量不为空
}
// 判断浮点数double是否为空
if (myDouble > minValue && myDouble < maxValue) {
// 变量为空
} else {
// 变量不为空
}
根据你的需求,可以根据实际情况选择对minValue
和maxValue
进行合适的赋值。
2.2 使用std::numeric_limits
std::numeric_limits
是 C++ 标准库 <limits>
头文件中提供的一个模板类,用于获取各种数值类型的属性和限制信息;
std::numeric_limits
提供了一个类型的模板特化,并提供了一系列静态成员常量,用于返回该类型的各种数值属性和限制信息;
示例
/*
* @brief: float type
* @complie: g++ -g ./main.cc -o d -std=c++11
* @auto: your name
* @date: 2023/06/30
*
*/
#include <iostream>
#include <string>
#include <vector>
#include <limits>
#include <cmath>
int main(int argc, char* argv[])
{
//1.method1
float f = 0.0;
const float eps = 1e-6;
if(std::abs(f) < eps)
{
std::cout << "f is approximately equal to 0" << std::endl;
}
else
{
std::cout << "f is not approximately equal to 0" << std::endl;
}
std::cout<<"====================="<<std::endl;
//2.method2
/*
auto fvalue = std::numeric_limits<float>::epsilon();
std::cout<<"fvalue is: "<<fvalue<<std::endl; //输出为1.19209e-07
auto dvalue = std::numeric_limits<double>::epsilon();
std::cout<<"dvalue is: "<<dvalue<<std::endl; //输出为2.22045e-16
*/
if(std::abs(f) < std::numeric_limits<float>::epsilon())
{
std::cout << "f is approximately equal to 0 " << std::endl;
}
else
{
std::cout << "f is not approximately equal to 0" << std::endl;
}
return 0;
}
输出
f is approximately equal to 0
=====================
f is approximately equal to 0
2.3 std::numeric_limits 说明
以下是 std::numeric_limits
提供的一些常用成员常量和其含义:
std::numeric_limits<T>::min()
:返回类型T
的最小有限值。std::numeric_limits<T>::max()
:返回类型T
的最大有限值。std::numeric_limits<T>::lowest()
:返回类型T
的最小可能值(包括负无穷大)。std::numeric_limits<T>::epsilon()
:返回类型T
的最小精度,即能够表示的最小的非零正数值与 1 之间的差值。std::numeric_limits<T>::digits
:返回类型T
的有效数字的位数。
还有许多其他成员常量,可以用来获取类型的大小、存储属性、舍入属性等信息。这些成员常量根据不同的数值类型,可能会有不同的值。
示例
#include <iostream>
#include <string>
#include <vector>
#include <limits>
#include <cmath>
int main(int argc, char* argv[])
{
//uint32_t
std::cout<<"=============uint32_t============"<<std::endl;
std::cout << "size of float: " << sizeof(uint32_t) << " bytes" << std::endl;
std::cout << "min value of float: " << std::numeric_limits<uint32_t>::min() << std::endl; //最小值
std::cout << "max value of float: " << std::numeric_limits<uint32_t>::max() << std::endl; //最大值
std::cout << "lowest value of float: " << std::numeric_limits<uint32_t>::lowest() << std::endl; //最小可能值
std::cout << "epsilon value of float: " << std::numeric_limits<uint32_t>::epsilon() << std::endl; //最小精度,即能够表示的最小的非零正数值与 1 之间的差值
std::cout << "digits value of float: " << std::numeric_limits<uint32_t>::digits << std::endl<<std::endl; //有效数字的位数
//int32_t
std::cout<<"=============int32_t============"<<std::endl;
std::cout << "size of float: " << sizeof(int32_t) << " bytes" << std::endl;
std::cout << "min value of float: " << std::numeric_limits<int32_t>::min() << std::endl; //最小值
std::cout << "max value of float: " << std::numeric_limits<int32_t>::max() << std::endl; //最大值
std::cout << "lowest value of float: " << std::numeric_limits<int32_t>::lowest() << std::endl; //最小可能值
std::cout << "epsilon value of float: " << std::numeric_limits<int32_t>::epsilon() << std::endl; //最小精度,即能够表示的最小的非零正数值与 1 之间的差值
std::cout << "digits value of float: " << std::numeric_limits<int32_t>::digits << std::endl<<std::endl; //有效数字的位数
//int64_t
std::cout<<"=============int64_t============"<<std::endl;
std::cout << "size of float: " << sizeof(int64_t) << " bytes" << std::endl;
std::cout << "min value of float: " << std::numeric_limits<int64_t>::min() << std::endl; //最小值
std::cout << "max value of float: " << std::numeric_limits<int64_t>::max() << std::endl; //最大值
std::cout << "lowest value of float: " << std::numeric_limits<int64_t>::lowest() << std::endl; //最小可能值
std::cout << "epsilon value of float: " << std::numeric_limits<int64_t>::epsilon() << std::endl; //最小精度,即能够表示的最小的非零正数值与 1 之间的差值
std::cout << "digits value of float: " << std::numeric_limits<int64_t>::digits << std::endl<<std::endl; //有效数字的位数
//float
std::cout<<"=============float============"<<std::endl;
std::cout << "size of float: " << sizeof(float) << " bytes" << std::endl;
std::cout << "min value of float: " << std::numeric_limits<float>::min() << std::endl; //最小值
std::cout << "max value of float: " << std::numeric_limits<float>::max() << std::endl; //最大值
std::cout << "lowest value of float: " << std::numeric_limits<float>::lowest() << std::endl; //最小可能值
std::cout << "epsilon value of float: " << std::numeric_limits<float>::epsilon() << std::endl; //最小精度,即能够表示的最小的非零正数值与 1 之间的差值
std::cout << "digits value of float: " << std::numeric_limits<float>::digits << std::endl<<std::endl; //有效数字的位数
//double
std::cout<<"=============double============"<<std::endl;
std::cout << "size of float: " << sizeof(double) << " bytes" << std::endl;
std::cout << "min value of float: " << std::numeric_limits<double>::min() << std::endl; //最小值
std::cout << "max value of float: " << std::numeric_limits<double>::max() << std::endl; //最大值
std::cout << "lowest value of float: " << std::numeric_limits<double>::lowest() << std::endl; //最小可能值
std::cout << "epsilon value of float: " << std::numeric_limits<double>::epsilon() << std::endl; //最小精度,即能够表示的最小的非零正数值与 1 之间的差值
std::cout << "digits value of float: " << std::numeric_limits<double>::digits << std::endl<<std::endl; //有效数字的位数
return 0;
}
输出
=============uint32_t============
size of float: 4 bytes
min value of float: 0
max value of float: 4294967295
lowest value of float: 0
epsilon value of float: 0
digits value of float: 32
=============int32_t============
size of float: 4 bytes
min value of float: -2147483648
max value of float: 2147483647
lowest value of float: -2147483648
epsilon value of float: 0
digits value of float: 31
=============int64_t============
size of float: 8 bytes
min value of float: -9223372036854775808
max value of float: 9223372036854775807
lowest value of float: -9223372036854775808
epsilon value of float: 0
digits value of float: 63
=============float============
size of float: 4 bytes
min value of float: 1.17549e-38
max value of float: 3.40282e+38
lowest value of float: -3.40282e+38
epsilon value of float: 1.19209e-07
digits value of float: 24
=============double============
size of float: 8 bytes
min value of float: 2.22507e-308
max value of float: 1.79769e+308
lowest value of float: -1.79769e+308
epsilon value of float: 2.22045e-16
digits value of float: 53