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
参考文献: