1.1.声明:
float x{3.1'415'926};
double x(3.1415926);
double x{2}; //可用int初始化
double x=2;
1.2.浮点字面量:后缀f,L,'
float x{2f};
auto x{ 1.0L }; //long double x;
auto x{ 1L }; //long x;
1.3.数据类型属性:
numeric_limits<double>::max(); //double最大值
numeric_limits<double>::min(); //可储存的最小正数2.225e-308
numeric_limits<double>::lowest(); //最小负数-1798e+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();
float pi = 3.1425926f;
size_t n = std::numeric_limits<decltype(pi)>::digits10;//6 获取位小数点的位数
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.无效浮点数结果:
除0的结果是不确定的,虽然如此硬件的浮点操作都是根据IEEE754标准实现,
因此在浮点数除以0时编译器一般会表现为类似行为,应查阅相关产品手册
IEEE浮点标准定义几个特色值 +infinity,-infinity无穷大,NaN非数字
-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)
pow(x,n)==x^2;
sqrt(x)=x^0.5
INFINITY无穷大,NaN:<cmath>判断:
bool isinf( float arg );
bool isinf( double arg ); //给定浮点数是否是无穷大
bool isinf( long double arg );
bool isinf( IntegralType arg ); //函数模板(arg强制转换为double)
bool isnan( float arg );
bool isnan( double arg );
bool isnan( long double arg );
bool isnan( IntegralType arg );