浮点数的二进制表示:
例如:-12.5 转为单精度二进制表示
12.5:
整数部分12,二进制为1100小数部分0.5, 二进制是.1,先把他们连起来,从第一个1数起取24位(后面补0):
1100 .1 000 00000000 00000000
这部分是有效数字。(把小数点前后两部分连起来再取掉头前的1,就是尾数)
把小数点移到第一个1的后面,需要左移3位(1.1001 000 00000000 0000 0000 *2^3 ), 加上偏移量127:127+3=130,二进制是10000010 ,这是阶码。
-12.5是负数,所以符号位是1。把符号位,阶码和尾数连起来。注意,尾数的第一位总是1,所以规定不存这一位的1,只取后23位:
1 10000010 10010000000000000000000
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。
二进制数(binaries)是逢2进位的进位制,0、1是基本算符;计算机运算基础采用二进制。电脑的基础是二进制。电子计算机出现以后,使用电子管来表示十种状态过于复杂,所以所有的电子计算机中只有两种基本的状态,开和关。也就是说,电子管的两种状态决定了以电子管为基础的电子计算机采用二进制来表示数字和数据。
浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。
浮点数是表示小数的一种方法.所谓浮点就是小数点的位置不固定,与此相反有定点数,即小数点的位置固定.整数可以看做是一种特殊的定点数,即小数点在末尾.8086/8088中没有浮点数处理指令,不过从486起,CPU内置了浮点数处理器,可以执行浮点运算.一般的浮点数有点象科学计数法,包括符号位、指数部分和尾数部分.浮点数是指小数点位置可以浮动的数据,通常以下式表示:
E次方
N = M·R
其中N为浮点数,M为尾数,E(为阶码也就是多少次方的意思),R为阶的基数,R一般为2进制(01),8...(01234567),16...(0123456789abcdef)
简单说浮点数是指能够精确到小数点以后的数值类型
整数部分:
小数部分:
例如:浮点数 4.8125
整数部分:
小数部分:
将整数与小数部分连接起来就是 100.1101 ,即 =
再如:浮点数 0.05
因为只有小数所以只处理小数部分:
可以看到二进制小数是无法准确表示浮点数的,所以就有了精度一说.
单精度浮点数用32位二进制表示如下:
双精度浮点数用64位二进制表示如下:
由上可知,
单精度浮点数精度为 pow(2,23) = 8388608 = 0.8388608 x pow(10,7)
所以单精度浮点数对应的10进制精度为 7 位多
双精度浮点数精度为 pow(2,52)-1 = 4503599627370496 = 0.4503599627370496 x pow(10,16)
所以双精度浮点数对应的10进制精度为 16 位多
移码(又叫增码)是由补码的符号位取反得到,一般用指数的移码减去1来做浮点数的阶码,
引入的目的是便于浮点数运算时的对阶操作。为了保证浮点数的机器零为全0。
对于定点整数,计算机一般采用补码的来存储。
正整数的符号位为 0,反码、补码、原码都一样。
负整数的符号位为 1,原码、反码和补码的表示各不相同,
由原码变成反码和补码有如下规则:
浮点数二进制表示:
比如十进制4.5的单精度浮点数的二进制 =表示为上述公式则为
看到这里的 E 为 2 ,那么它在计算机实际存储为 2 + 127 = 129 =
根据上面的公式各部分表示的规则得到一个32位浮点数表示如下表:
符号位为 0 表示是正数,所以 4.5 的二进制存储为 0 10000001 00100000000000000000000 ,即 = 0x40900000
以下 tool.c 是一个测试工具:
下面是我们把上述二进制转为二进制浮点数
如果得到阶码是负数比如下面的 0.5 和 0.05 ,规则是先在首位补 1 ,然后向左移动小数点,不够补 0
综上我们知道
阶码为正小数点 右移 ,先移动小数点再补 1 。
阶码为负小数点 左移 ,先补 1 再移动小数点,不足补 0
二进制浮点数转10进制浮点数,这里是单精度,双精度同理
根据公式定义:
0.15625 二进制表示如下:
转换如下:
IEEE754 Wiki
单精度浮点数
双精度浮点数
浮点数表示
二进制浮点数在线转换