C++中实数(以float为例)的存储方式
2015-11-10 18:18
316 查看
(1)float 型在内存中存在方式:
a.float型转化成科学计数法的二进制形式:b1.b2b3b4b5.......*2^k,b1定为1,b1.b2b3b4b5...称为尾数,k称为指数
b.float型数一共32位(符号占1位,指数占8位,尾数占23位)
(2)float型数的范围与表示精度:
a.范围:指数占8位,取值范围~128到127,但是在内存中表示为0到255,当指数取127,尾数全为1的时候,取最大值2^127*(1.1111111)=3.4*10^38
当符号位位1时,取到最小值-3.4*10^38。
b.精度:一位十进制数需要4位二进制数表示,b1始终为1,所以共有24位二进制位,可表示6个十进制数。
(3)float的溢出与舍入误差:
a.溢出:指数位数有限,超出指数为能表示的大小,便发生溢出。
b.舍入误差:尾数位有限,有些数字虽很小,但是表示成科学计数法的二进制数时,位数是无穷的(例如:十进制数0.1的二进制表示为 0.000110011001100110011 0011001100110011001100110011001101,位数无穷位),这时就会发生舍入误差。
疑问:既然十进制数0.1在内存中的表示有舍入误差,为什么在编程时初始化一个float变量为 0.1,然后输出此变量的值还是0.1???
a.float型转化成科学计数法的二进制形式:b1.b2b3b4b5.......*2^k,b1定为1,b1.b2b3b4b5...称为尾数,k称为指数
b.float型数一共32位(符号占1位,指数占8位,尾数占23位)
(2)float型数的范围与表示精度:
a.范围:指数占8位,取值范围~128到127,但是在内存中表示为0到255,当指数取127,尾数全为1的时候,取最大值2^127*(1.1111111)=3.4*10^38
当符号位位1时,取到最小值-3.4*10^38。
b.精度:一位十进制数需要4位二进制数表示,b1始终为1,所以共有24位二进制位,可表示6个十进制数。
(3)float的溢出与舍入误差:
a.溢出:指数位数有限,超出指数为能表示的大小,便发生溢出。
b.舍入误差:尾数位有限,有些数字虽很小,但是表示成科学计数法的二进制数时,位数是无穷的(例如:十进制数0.1的二进制表示为 0.000110011001100110011 0011001100110011001100110011001101,位数无穷位),这时就会发生舍入误差。
疑问:既然十进制数0.1在内存中的表示有舍入误差,为什么在编程时初始化一个float变量为 0.1,然后输出此变量的值还是0.1???
相关文章推荐
- C++链表翻转
- 黑马程序员--C语言基础--指针
- C++标准库中的list的实现原理
- 01-C++11的使用
- C语言基础-指针
- C++基础::类设计的几大原则
- C++中指针和引用的区别(超详细)
- C++内存管理学习堆和栈
- 【c语言】 模拟实现printf,要求功能: my_printf("dc\ts\ndc\ndc\ts!", ...)
- c/c++之模板方法实现归并排序
- 黑马程序员--C语言基础--基本运算
- c++程序的内存格局
- C++笔记(二)------ 头文件
- 浅谈C++多态性
- C/C++ 中的0长数组(柔性数组)
- C++ enum
- c语言中float、double的区别和用string定义字符串反置
- Eclipse配置c/c++编程环境,完整教程+附样例
- 0生1,1生C,C生万物
- 黑马程序员——C语言基础02—数据类型