杂谈浮点数运算为什么算不准

IEEE浮点数

浮点数为什么算不准

  • 为什么浮点数会出现01+02=0.30000004呢?
  • 网上总有截图用来嘲笑JS,PY等脚本语言,但是实际上这还真不是脚本的锅。
  • 计算机底层是没办法直接存储浮点类型的数据,毕竟二进制嘛天然是整数,正好用委婉的方式迂回存储。
  • 将之转换为二进制用来存储(这套标准是IEEE委员会定下的),而部分浮点数转成二进制是无限循环的,自然就有一定的误差。

怎么避免误差呢?

  1. 我们可以用乘法的方式,比如0.1+0.2可以转换为(0.1*10+0.2*10)/10,当然这会有一定的性能损耗。
  2. 可以使用double类型,双精度可以很好的避免误差的情况,至于js,py等没有精度分别的语言嘛,也就只有第一种喽。

IEEE 754标准

  1. 基本结构
  • 符号位(Sign Bit):表示数值的正负,通常用1位表示。0表示正数,1表示负数.
  • 指数位(Exponent Bits):用于表示数值的范围。指数采用偏移量(Bias)表示法,即实际指数值加上一个偏移量.
  • 尾数位(Fraction/Mantissa Bits):用于表示数值的精度部分。尾数通常采用隐含形式,即在二进制表示中省略掉最高位的1(因为任何非零的二进制浮点数都可以表示为1.xxxxx的形式).
  1. 精度和范围
  • 单精度浮点数(32位):
  • 符号位:1位
  • 指数位:8位
  • 尾数位:23位
  • 双精度浮点数(64位):
  • 符号位:1位
  • 指数位:11位
  • 尾数位:52位

IEEE 委员会

  • 电气与电子工程师协会(IEEE),负责制定与电子学相关市场相关的领先技术标准和行业解决方案。
  • 电气与电子工程师协会(IEEE)的历史可以追溯到其两个前身组织:美国电气工程师协会(AIEE)和无线电工程师协会(IRE)。
  • 其中美国电气工程师协会(AIEE):成立于1884年,主要关注有线通讯、光学以及动力系统的研究,AIEE在其发展过程中吸引了许多著名的发明家,如托马斯·阿尔瓦·爱迪生和亚历山大·格拉汉姆·贝尔
  • 另一个则是无线电工程师协会(IRE):成立于1912年,以无线电研究为核心,后来扩展到电子学领域

本章中英对照表

英文中文
Sign Bit符号位
Exponent Bits指数位
Fraction/Mantissa Bits尾数位

For Paul

这是一个个人博客,主要用于记录自己的学习过程,用于ts和rust的技术交流

© 2025 Paul Blog • Made withby Paul

使用 Next Rust 和 Tailwind CSS 构建

最近更新时间: 2025-04-29