作者简介:互联网行业 算法研发工程师
本文适合阅读者:对C语言浮点数有一些疑惑的同学~
C语言的基本数据类型中,除了整数之外,还包含浮点数。
浮点数在机器中是如何表示的呢?
科学计数法,我们比较熟悉,任何十进制的数,都可以表示为:一个小数✖10的多少次方。
尾数的小数点前面有一位有效数字【规格化的形式】。
10称为基,10上面的数称为指数。
同理,对于2进制数,也可以写成这种形式。
32位浮点数的表示形式是:
正负号【符号位】 ✖ 0.1xxxxx【尾数部分】 ✖ 2^E【指数部分/阶】
注意:
- 符号S是尾数的一部分,是尾数的符号;
- 阶码,指数部分对应的编码,用第1到第8位来表示,一共有8位,是用移码表示的,8位移码,它的偏置常数,通常是2的8-1次方,也就是2的7次方,也就是128。【注意,如果不考虑全1情况是特殊情况,偏置常数就是128。如果 考虑到全1情况是特殊情况,那么,偏置常数就是127【2的7次方-1】,并且,尾数部分的表示就是以1开头了,而不是以0开头【其实两种表示是一个意思】,下面还会讲到】
- 后面的23位(9~31)是尾数部分,23位表示了24位的尾数,为什么呢?这是因为规格化的尾数,小数点后面第一位总是1,而这个1我们不在32位的格式中表示。
最大的正数
在规定的格式中,最大的正数是多少?怎么计算呢?
方法1:
0.1(不明显表示)1111...1111【23位个1】✖ 2^(111...111)
用2进制表示就是:
0 1111 1111 111 1111 1111 1111 1111 1111
符号位 阶码(移码) 尾数
=1 * 0.1 1...11 * 2^1111 1111
分析过程:
最大正数= 尾数阶码转换为进制尾数∗2阶码转换为10进制