一、数据在内存中的存储
由于算法工程中打交道最多的是某个位置的坐标值,坐标[x,y,z]的值在Java开发中我们一般以double类型的数组表示,故本文主要简单回顾了浮点数在内存中的存储方式
(1)IEEE-754标准
历史:
IEEE-754标准的主要起草者是来自UCB的数学教授William Kahan。他帮助Intel设计完成了8087浮点运算单元(FPU)。由于设计的浮点标准是如此的出色,使得IEEE将此标准作为IEEE浮点格式的基础。
为了浮点数据处理对于硬件、软件或者两者的结合都能产生独立的结果,不受平台的影响,IEEE为执行浮点运算提供了一个统一标准,其规定了浮点数的表示格式、操作方式、舍入模式及异常处理
浮点数表示格式
在IEEE-754标准下,浮点格式主要分为四种类行,即单精度格式、双精度格式、扩展单精度格式和扩展双精度格式。其中32位单精度格式与64位双精度格式作为基础格式更为常用,扩展格式则有特殊目的,一般对用户透明。
(2)浮点数的存储方式
IEEE754 标准中规定 float 单精度浮点数在机器中表示用 1 位表示数字的符号,用 8 位表示指数,用 23 位表示尾数,即小数部分。对于 double 双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。IEEE754 浮点数的格式如下图所示。
符号位 (Sign):0代表正数,1代表为负数;
指数位 (Exponent):用于存储科学计数法中的指数数据;
尾数部分 (Mantissa):采用移位存储尾数部分;
(3)简单示例
118.5二进制的科学计数法表示 1110110.1,可以表示为1.1101101 * 26
任何一个二进制数的科学计数法表示都为1. xxx * 2^n ,尾数部分就可以表示为xxxx,由于第一位都是1,所以将小数点前面的1省略。由此,23bit的尾数部分,可以表示的精度却变成了24bit(float有效位数相应的也会发生变化,而double则不会,因达不到)
小数部分:4bit 能精确十进制中的1位小数点(十进制9转为二进制为1001),24bit就能使 float 精确到小数点后6位
指数部分:指数可正可负(占1位),故8位的指数位能表示的指数范围只能用7位,范围是:-127至128。所以指数部分的存储采用移位存储,存储的数据为元数据 +127。
思考:移位存储的好处(待更新)
118.5 用二进制的科学计数法表示为: 1.1101101 * 26 ,按照上面的存储方式:
符号位为:0,表示为正;
指数位为:6+127=133,即 10000101;
尾数部分为:1101101;
双精度浮点数的存储和单精度的存储大同小异,不同的是指数部分和尾数部分的位数。