C++ Primer Plus学习 三 处理数据 剩余部分

3.2const限定符

常量的符号名称,符号名称指出了常量表示的内容。如果程序在多个地方使用同一个常量,则需要修改该常量时,只需要修改一个符号定义即可。

此时我们可以想到一个东西:#define ZERO 0;(旁注“符号常量——预处理器方法”)。

C++有另外一种处理符号常量的方法,const关键字

        const type name = value

const int Months = 12

        const 是缩写,原词是constant,意为不变的

3.3浮点数

本质:科学表示法

        计算机组成原理中的浮点型:

 上面的图是内部的浮点数表示,用的是二进制。

3.3.1 书写浮点数

  •  平时的小数书写方法 :3.4,0.003 ,0.5
  •  E表示法

       E表示法,就是科学计数法。例如:3.45E6指的是3.45 与 10^6相乘。

       指数可以是负数,所以3.45E-5,就是3.45*10^-6

3.3.2 浮点数的类型

  •  float ,double ,long double

 根据黄色的地方看出,三种浮点数类型的有效位:

float:6

double:15

long double: 18

有关cout.setf()的用法,第一原型和第二原型

C++ 中的 cout.setf() 函数_白水的博客-CSDN博客_cout.setf()

#include<iostream>

int main() {
	using namespace std;
	cout.setf(ios_base::fixed, ios_base::floatfield);
	float tub = 10.0 / 3.0;
	double mint = 10.0 / 3.0;
	const float Million = 1.0E6;

	cout << "tub = " << tub;
	cout << ",a million tubs = " << Million * tub;
	cout << ",\nten million tubs = ";
	cout << 10 * Million * tub << endl;

	cout << "mint = " << mint;
	cout << " and a million mints = " << mint * Million << endl;
	return 0;

}
tub = 3.333333,a million tubs = 3333333.250000,
ten million tubs = 33333332.000000
mint = 3.333333 and a million mints = 3333333.333333

float符号位1位,指数位8位,尾数位23位。

 

如果我们先不考虑,指数位:
        能表示的最大的二进制数是2^23-1 1111111 11111111 11111111,因为科学计数法,而且由于二进制的原因,所以小数点前一位,一定是1。所以最大的数其实是2^24-1,11111111 11111111 11111111。

float的指数位是无符号的,它的正负区分通过采用一个偏移值来确定,下表可以查到float单精度的偏移值是127。偏移前表达范围[0,255],经过偏移后,8位指数位所能表达的范围是:[-127,128]。

不过通过查看float.h文件发现,float二进制最大指数是128,最小-125

 

 该图片来自AlbertSfloat的精度和取值范围_AlbertS Home of Technology-CSDN博客_float的取值范围

所以最大取值为1.11111111 11111111 1111111(24个一)*2^127

 

与文件中的 float的符号常量一致。他妈的终于弄懂他这逼玩意范围了

知道范围如何求得以后,就容易知道,为啥精度缺失了。因为尾数位有限,在尾数位+1(科学计数法,二进制小数点前一位,必然是1,不理解可以看十进制的科学计数法。小数点前一位可以是1-9里的任意一个数字,所以二进制,只能是1,尾数位只存储小数点之后的,在这里尾数位加一),也就是24位二进制所表示的最大范围内[0,16777215]。有效位在这个范围内的数(先忽略小数点)都可以被精确表示。我看了很多资料,关于float的精确度,我觉得很晦涩难懂,我想如果借助有效位这个概念,便一目了然了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值