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

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 );

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值