学习笔记:浮点数的表示方法,区别long和double

浮点数的表示方法

IEEE754浮点数的表示方法:N = (-1)^s x m x 2^e,其中s为符号位,m是尾数位,e是指数位。

种类 符号位 指数位 尾数位
float 第31位(占1bit) 第30-23位(占8bit) 第22-0位(占23bit)
double 第63位(占1bit) 第62-52位(占11bit) 第51-0位(占52bit)

对于单精度浮点数(float)来说,符号位一位,指数位8位,尾数23位。指数能够表示的指数范围为-128~127,尾数为23位。

float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。

  • float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
  • double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。(指数二进制转换为十进制)

  • float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38.
  • double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~+1.79E+308.

具体计算公式N = (-1)^s x m x 2^e,以float为栗子,但s=0,m=23,e=8时:

+1.1111111111111111111111 x 2^127(小数点后面23个1,由于尾数的范围1~2,其最高位总为1,故只需存取小数部分,所以小数为是23位1),约等于2 x 2^127=3.4 x 10^38。负数亦然。

long和double的区别

long表示的是一个整型的数据,在不同系统或语言定义可能不同,在内存32位或64位,即表示的是一个有32/64位二进制数表示的一个整数,最大为 2^63-1.

但double不一样,表示的是浮点数,以EEE754浮点数表示方法为:N = (-1)^s x m x 2^e,其范围和精度是由其指数和位数决定的。所说的32位或64位是指该浮点数的符号位+指数位+尾数位.

两者在表示形式就不一样,而不能简单地根据数据所占位数去比较它们的大小。

补充:理解32位系统和64位系统

32位系统CPU一次可处理32位数据,即一次处理4个字节;64位系统CPU一次可处理64位数据,即一次处理8个字节。

x86与x86-64有什么区别呢?x86指的是一般意义上的32位Intel处理器;而x86_64 则是一般意义上的64位Intel处理器。

posted @ 2019-10-04 17:55  microbit1024  阅读(2907)  评论(0编辑  收藏  举报