浮点数在内存中的存储可以参考《IEEE754标准》https://people.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF
参考博文:IEEE754详解(最详细简单有趣味的介绍)-优快云博客
单精度float占内存4字节,最高位bit31表示符号位,指数位bit23~bit30占用8个bit位,剩余的23个bit表示尾数。
双精度double占用内存8字节,最高位bit63表示符号位,指数位bit52~bit62占用11个bit位,剩余的52个bit表示尾数。
字节长度 | 符号位S | 指数位E | 尾数M | |
单精度 | 4字节 | 1 [31] | 8 [30-23] | 23 [22-0] |
双精度 | 8字节 | 1 [63] | 11 [62-52] | 52 [51-0] |
任何一个数,都可以使用不同的权重表示,最终的计算结果公式如下:
假如有一个数:AnAn-1An-2...A2A1B1B2...Bn-1Bn,其中A1~An表示整数部分的每一位数,B1~Bn表示小数部分的每一位数。权重为Q,则
S = An*Q^(n-1)+An-1*Q^(n-2)+...+A2*Q^1+A1*Q^0+B1*Q^(-1)+B2*Q^(-2)+...Bn-1*Q^(-(n-1))+Bn*Q^(-n)
例如十进制数:123.456,对应的十进制数是
S = 1*10^2+2*10^1+3*10^0+4*10^(-1)+5*10^(-2)+6*10^(-3)
再比如二进制数:1011.011,对应的十进制数是
S = 1*2^3+0*2^2+1*2^1+1*2^0+0*2^(-1)+1*2^(-2)+1*2^(-3) = 11.365
再比如八进制数:56.76,对应的十进制是
S = 5*8^1+6*8^0+7*8^(-1)+6*8^(-2) = 46.96875
将10进制数转为其他进制,比如将整数为A,小数为B变为b进制(123.456:整数A=123,小数B=0.456),则步骤如下:
整数部分:
1. A除以b得到商B和余数R1
2. B除以b得到商C和余数R2
3. .................................Rn-1
4. 重复2,直到商为0,余数为Rn
则整数部分是:RnRn-1...R2R1
小数部分:
1. 小数B乘以b得到积B',再将B'拆分成整数部分F1和小数C
2. 小数C乘以b得到积C',再将C'拆分成整数部分F2和小数D
3. 小数D乘以b得到积D',再将D'拆分成整数部分F3和小数E
4. 重复上述过程,直到小数为0。(有可能永远不会等于0)
则小数部分是:F1F2F3...Fn-1Fn.........