浮点数存储方式

Posted xuzhaoping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浮点数存储方式相关的知识,希望对你有一定的参考价值。

|--浮点数怎么存储在计算机中

  浮点型变量是由符号位+阶码位+尾数位组成。

  float型数据 二进制为32位,符号位1位,阶码8位,尾数23位
  double型数据 二进制为64位,符号位1位,阶码11位,尾数52位

|--单精度32位存储
  1bit 8bit 23bit

|--双精度64位存储
  1bit 11bit 52bit

  浮点数二进制存储形式,是符号位+阶码位+尾数位(针对有符号数)

  浮点数没有无符号数(c语言)

|--阶码:
  这里阶码采用移码表示,对于float型数据其规定偏置量为127,阶码有正有负,
  对于8位二进制,则其表示范围为-128-127,double型规定为1023,其表示范围为-1024-1023
  比如对于float型数据,若阶码的真实值为2,则加上127后为129,其阶码表示形式为10000010

|--尾数:
  有效数字位,即部分二进制位(小数点后面的二进制位),
  因为规定M的整数部分恒为1(有效数字位从左边不是0的第一位算起),所以这个1就不进行存储

|--具体步骤:
  把浮点数先化为科学计数法表示形式,eg:1.1111011*2^6,然后取阶码(6)的值加上127(对于float)
  计算出阶码,尾数是处小数点后的位数(1111011),如果不够23位,则在后面补0至23位。
  最后,符号位+阶码位+尾数位就是其内存中二进制的存储形式

 1     eg:
 2         #include <stdio.h>
 3         #include <stdlib.h>
 4         int main(int argc, char *argv[])
 5         
 6             int x = 12;
 7             char *q = (char *)&x;
 8             float a=125.5;
 9             char *p=(char *)&a;
10             
11             printf("%d\n", *q);   
12             
13             printf("%d\n",*p);  
14             printf("%d\n",*(p+1)); 
15             printf("%d\n",*(p+2)); 
16             printf("%d\n",*(p+3));  
17             return 0;
18         
19     
20     output:
21         12
22         0
23         0
24         -5
25         66

 

|--对于float型:
  125.5二进制表示为1111101.1,由于规定尾数的整数部分恒为1,
  则表示为1.1111011*2^6,阶码为6,加上127为133,则表示为10000101
  而对于尾数将整数部分1去掉,为1111011,在其后面补0使其位数达到23位,
  则为11110110000000000000000

  内存中的表现形式为:

            00000000 低地址
            00000000
            11111011
            01000010 高地址

            存储形式为: 00 00 fb 42
            依次打印为: 0 0 -5 66

  解释下-5,内存中是:11111011,因为是有符号变量所以符号位为1是负数,
  所以其真值为符号位不变取反加一,变为:10000101化为十进制为-5.

以上是关于浮点数存储方式的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:为啥我不能将单个浮点数从顶点着色器传递到片段着色器?

float浮点数的二进制存储方式及转换

[算法]浮点数在内存中的存储方式

浮点数的存储

计算机中的定点数与浮点数 浮点数用 正负位 幕数 数字部分来表示

两大基本数据类型 - 整数类型 / 浮点数类型