【知识点】浅谈浮点数

一、浮点数在内存中的表示方式

IEEE 754标准规定:

类型比特(位)数
float32(4字节)
double64(8字节)

无论是单精度还是双精度在存储中都分为三个部分:
  1. 符号位(Sign) : 0代表正,1代表为负
  2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
  3. 尾数部分(Mantissa):尾数部分

float数据类型在内存中的存储形式如下图所示:

float

float


double数据类型在内存中的存储形式如下图所示:

double

double

二、由浮点数的二进制得到十进制实数的方法

float数据类型的计算方法:

float_formula

float_exponent_encoding

double数据类型的计算方法:

double_formula

double_exponent_encoding

简便的计算方法:

  1. float数据类型的计算方法:

    real value = (-1)^sign * ( fraction/(2^23) + 1 ) * ( 2^(exponent-127) )
  2. double数据类型的计算方法:

    real value = (-1)^sign * ( fraction/(2^52) + 1 ) * ( 2^(exponent-1023) )
解释: fraction/(2^x) 相当于二进制数的小数点向左移动x位. 例如 0001 0001b / 2^8 = 0.0001 0001b =

formula

代码示例(Lua):

-- a double-precision floating-point number
datas = {
    0x76 ,0xFF ,0x43 ,0x52 ,0xF7 ,0xBE ,0x8B ,0x40     -- LSB first
    ,0x90 ,0x05 ,0x26 ,0x5D ,0xD6 ,0xD0 ,0x72 ,0x40
}

-- sign
sign = bit.rshift( bit.band(0x10,datas[8]),7 )
print(sign)

-- exponent
exponent = bit.lshift( bit.band(0x7F,datas[8]) , 4) + bit.rshift( bit.band(0xF0,datas[7]),4 ) -1023
print(exponent)

-- fraction
fraction = ( (bit.lshift(bit.band(datas[7],0x0f),16) + bit.lshift(datas[6],8) + datas[5]) * (2^32) ) +( bit.lshift(datas[4],24) + bit.lshift(datas[3],16) + bit.lshift(datas[2],8) + datas[1] )
print(fraction)

results = (-1)^sign * (fraction/(2^52) + 1) * (2^exponent)

print(results)

参考资料:

  1. Single-precision floating-point format
  2. Double-precision floating-point format
  3. 浮点数有效数字位数
  4. 你应该知道的浮点数基础知识

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值