论浮点数的存储和计算为什么总会产生微小的误差

本文探讨浮点数的存储和计算为何会产生微小误差,介绍了IEEE754标准中的单精度浮点数表示,并分析了对阶、尾数求和与规格化的过程,指出精度问题源于有效数字位数限制。建议在要求精确的业务场景中避免使用浮点数,推荐使用整型、数组或decimal类型。
摘要由CSDN通过智能技术生成

本文内容基于《码出高效 Java开发手册》,杨冠宝、高海慧著。


1. 背景

使用浮点数存储和计算的场景无处不在,若使用不当则容易造成计算值与理论值不一致:

浮点数是以科学计数法来表示的,原因是科学计数法可以唯一地表示任何一个数,且所占用的存储空间会更少,计算机就是利用这一特性表示极大或极小的数值。

2. 浮点数表示

浮点数表示就是如何用二进制数表示符号、指数和有效数字。以IEEE754标准中的单精度浮点数为例:

  • 符号位

在最高二进制位上分配1位表示浮点数的符号,0表示正数,1表示负数。

  • 阶码位

在符号位右侧分配8位用来存储指数,阶码位存储的是指数对应的移码。移码是将一个真值在数轴上正向平移一个偏移量之后得到的,假设指数的真值是e,阶码为E,则有E = e + (2 ^ (n - 1) - 1),其中n是阶码的二进制位数。

  • 尾数位

最右侧分配连续的23位用来存储有效数字,以原码表示。二进制数值规格化后的尾数形式为1.xyz,满足1≤|a|<2,为了节约存储空间,将符合规格化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值