CPP学习之——浮点型变量(4.10)

一 前言

本节学习float浮点型变量 :

  • 长度为4个字节,是32位二进制。取值范围为1.2e-38(2*2^-126)-3.40e+38(2*2^128)
  • 0 00000000 00000000000000000000000
  • 符号 指数位(偏码为127) 尾数未(共23位,省略了最高位的固定整数1)

二 浮点概述

  • 符号位为零是正,为1为负.
  • 指数位共八位,可表示0255或者-126128.
  • 由于它的取值范围是由指数来定的,所以剩余尾数23位,最多可表示2*2^23个有效数字,以10为底的对数为log10(2*2^23)=6.92,因此它的有效数字为6~7位。

三 代码及结果

3.1 代码

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
float a=12.3456789012345;
//cout<<setprecision(15)<<a;
cout<<a;
return 0;
}

3.2 输出结果

1
12.3457

四 原因分析

  • float数据的精度为6~7位,后面的数据舍弃掉了

五 如何保留精度

5.1 使用iomanip中的setprecision指定显示

1
2
#include<iomanip>
cout<<setprecision(15)<<a;

5.2 使用double表示

  • double 占用8个字节,比float多占一倍,因此它的精度也大了一倍
  • 这样double的有效数字就是15或者16位

六 double 型数据

6.1 概念

  • 长度为8个字节,是64位二进制。取值范围为2.2e-308(2*2^-1022)-1.80e+308(2*2^1024)
  • 0 11个0 52个0
  • 符号 11个偏码表示的指数位(偏值1023) 尾数位(共52位,省略了最高位的固定整数1)
  • 符号位为零是正,为1为负
  • 指数位共11位,可表示02047或-10221024
  • 由于它的取值范围是由指数来定的,所以剩余尾数52位,最多可表示2*2^52个有效数字,以10为底的对数为log10(2*2^52)=15.65,因此它的有效数字为15~16位。

6.2 Double和float的区别

  • 对编程人员来说,double和float的区别是double精度高,有效数字1516位,float精度67位。
  • 但double消耗内存是float的两倍,double的运算速度比float慢的多,能用单精度时不要用双精度(以省内存,加速运算速度)