学习笔记:浮点数的表示方法,区别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处理器。