IEEE 7541IEEE 754浮点数转换刨根问底协议ContentsIEEE 754 ............................................................................................... 1十进制与二进制转换 .................................................................................. 2舍入操作 ............................................................................................... 2还原 .................................................................................................... 3一个小数的二进制是怎么样的呢?我们先看看一个二进制的小数怎么转换成十进制:IEEE 754标准中规定了浮点数在计算机中的表示方法,主要就是单精度和双精度 S Exp FractionSingle(32bit) ▯▮▮▮▮▮▮▮▮▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯Double(64bit) ▯▮▮▮▮▮▮▮▮▮▮▮▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯其计算公式为:其中,为指数偏移值,是一个固定值,即其中为指数部分的比特长度。单精度双精度举个例子,刚才我们算出来的小数可以这样表示:因此在计算机中,表示为:Float:▯▮▮▮▮▮▮▮▮▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯ 舍入操作2010000011110101011..............Double:▯▮▮▮▮▮▮▮▮▮▮▮▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯010000000011110101011...........................................不足的部分补上,即:除了正常的浮点数外,还有几个比较特殊的:十进制与二进制转换计算方式为,将小数的整数部分与取余倒序排列;将小数部分与取整正序排列。例如,将转换为首先将整数部分直接转换为二进制小数部分为,不断乘以后取整数部分,然后用小数继续乘以直到值为重复以上步骤,得到舍入操作对于尾数多余精度的情况,需要舍去多余的部分,但不是按照四舍五入的方式,而是按照向偶舍入的方式,意思就是,如果多余的部分大于则最低位进;如果小于则舍去;如果正好是等于则根据最低位判断,如果最低位是则进位,否则舍去。这样按照统计学来看,对于一个小数有相同的机会进位或者被舍去。例如对于上例中的,我们可以得到: 还原3因此的表示为:▯▮▮▮▮▮▮▮▮▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯▯01000000010010001111010111000011还原那么,对于一个存储在磁盘上的浮点数,我们怎么将它加载到内存中来?对于来说,实际也是采用的标准,所以实际上浮点数在内存中的表示是一致的,直接转换即可:struct ConstantFloat { mutable u4 bytes; float &getValue() const { return *reinterpret_cast<float *>(&bytes); } };参考:表示浮点数