嘘~ 正在从服务器偷取页面 . . .

C++ double类型用法总结


C++ double类型用法总结

下文均采用double

施工中,咕咕咕...

// 1.1 声明变量的方法
double x;
double x{3.1'415'926}; // double x{3.1415926};
double x(3.1415926);
double x{2};
double x=2; 

// 1.2 浮点字面量
// 可以用 typeid(x).name() 来输出x的类型
float x{2f};
auto x{1.112}     // double x
auto x{ 1.0L };   // long double x;
auto x{ 1L };     // int x; 

// 1.3 数据类型属性:
numeric_limits<double>::max();        //可储存的最大正数 1.79769e+308
numeric_limits<double>::min();        //可储存的最小正数 2.225e-308
numeric_limits<double>::lowest();     //可储存的最小负数 -1.798e+308

float positive_infinity = std::numeric_limits<float>::infinity();
double negative_infinity = -std::numeric_limits<double>::infinity();
long double not_a_number = std::numeric_limits<long double>::quiet_NaN();

// 获取位小数点的位数(好像没什么大用处)
double pi = 3.1425926; // (double)(3.142592599999999958)
size_t n = std::numeric_limits<decltype(pi)>::digits10; 
std::cout << n << '\n'; // 输出15
// 2.1 浮点变量局限:固定精度限制
// 1)小数值没有正确转换位二进制浮点数
// 2)计算两个非常接近数值之差会丧失精度 
// 3)处理范围相差几个数量级的数值会导致错误 

3.650000e+06+1.230000e-04=3.650000e+06//转换为7位精度
3'650'000+0.000'123=3'650'000.000'123 //实际结果
    
    
// 注意: 要确保结果有效,需要考虑值域及相对值,分析并最大化数学计算和算法的精度(数值分析)
// 对于斜率优化中斜率的计算,一般不采用除法,而采用移项后的乘法

// 2.2 无效浮点数结果
// IEEE浮点标准定义的几个特色值 +infinity,-infinity无穷大,NaN非数字(Not a Number)
    
-0.0==0.0;            //true
1.0/0.0 == INFINITY;  //true
1.0/-0.0 == -INFINITY;//true

± value/0  = ±infinity;
± infinity ± value = ± infinity;
± infinity * value = ± infinity;
± infinity / value = ± infinity;

0/0 =NaN;
±infinity/±infinity = NaN;
infinity-infinity = NaN;
infinity*0 = NaN;
 
/*
说明:
    有许多不同NaN值,见std :: nan和std :: numeric_limits :: quiet_NaN    
    NaN值永远不会等于自己或其他NaN值    
    测试浮点值是否为NaN的另一种方法是将其与自身进行比较: 
    bool is_nan (double x) { return x != x ; }
*/
 
// 2.3 取模%不能用于浮点数
// 2.4 实例:
 #include <assert.h>
 #include <iostream>  
 #include<type_traits>
 #include <cmath>
 #include <cfloat>
 
 using namespace std;
 
 int main() {
  std::cout << std::boolalpha << 1 << endl;
 
  assert(std::isinf(NAN) == false);
  assert(std::isinf(INFINITY) == true);
  assert(std::isinf(0.0) == false);
  assert(std::isinf(std::exp(800)) == true);
  //assert(std::isinf(DBL_MIN /0) == true);//VS2017报错被0除
  
  assert(std::isnan(NAN) == true);
  assert(std::isnan(INFINITY) == false);
  //assert(std::isnan(0/0) == true);
  assert(std::isnan(INFINITY - INFINITY) == true);
 }
// 3 备注:<cmath>
 
/*
说明:
 1)数学库可接受浮点数和整数,浮点数参数返回与浮点数参数相同的类型,整数返回double
       abs(int)->int  //特殊 abs(浮点数)->浮点数
 2)atan(a/b)有问题计算a/b时会丢掉a和b的符号。最好调用atan2(a,b)//知道a,b符号
*/

// 函数:
    ceil(x)                   //计算浮点值>= x的最小整数ceil(2.5)=3.0;ceil(-2.5)=-2;
    floor(x)                    //计算浮点值<=x的最大整数floor(2.5)=2.0;fool(-2.5)=-3.0;
    round(x)                  //将x四舍五入到最接近的整数,对输入int结果也是浮点值
    lround(x),llround(x);//lround(0.5)=1L;round(-0.5f)=-2.0f;
 
    exp(x) // e^x
    log(x) // ln x
    pow(x,n) // x^n ,适用于计算
    sqrt(x) // 根号x
    cbrt(x) // 三次根号x
 
判断INFINITY和nan:
	// 注意只适用于浮点型
	isfinite(x);		//不是INFINITY返回1
    isinf(x);		//是INFINITY返回1
	isnan(x);		//是NaN返回1

	

参考文献

[1] C++17基本教程 第3讲 float/double (tcy)

[2] C++创建对象时区分圆括号和大括号


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录