Bootstrap

C++ float类型如何判读是否为0

本位主要介绍C++中float类型,如何判断是否为0

在C++中,floatdouble类型的变量不能直接判断是否为空。这是因为浮点数类型的变量可以包含很小或很大的值,并且有特殊的取值比如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 {
    // 变量不为空
}

根据你的需求,可以根据实际情况选择对minValuemaxValue进行合适的赋值。

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
;