无需登录 数据私有 本地保存

浮点数二进制存储查看器 - IEEE 754 单双精度转换

31
0
0
0
IEEE 754 标准是什么?它定义了什么?

IEEE 754 是由国际电气与电子工程师协会(IEEE)制定的浮点数运算和表示标准,被几乎所有现代计算机系统采用。该标准定义了浮点数的二进制存储格式(包括单精度 32 位和双精度 64 位)、浮点数的算术运算规则、四种舍入模式(最近偶数舍入、向零舍入、向上舍入、向下舍入)、五种异常(上溢、下溢、除以零、无效运算、不精确)的处理方式。标准于 1985 年首次发布,最新版本为 IEEE 754-2019。IEEE 754 的核心思想是用有限的二进制位来近似表示实数轴上的数值。

单精度和双精度浮点数有什么区别?

单精度(32 位)和双精度(64 位)的主要区别在于精度和表示范围。单精度由 1 位符号位、8 位指数位和 23 位尾数位组成,指数偏移量为 127,可以表示约 7 位有效十进制数字,数值范围约为 ±1.18×10^-38 到 ±3.4×10^38。双精度由 1 位符号位、11 位指数位和 52 位尾数位组成,指数偏移量为 1023,可以表示约 15-16 位有效十进制数字,数值范围约为 ±2.23×10^-308 到 ±1.80×10^308。在大多数编程语言中,float 类型对应单精度,double 类型对应双精度。选择哪种精度取决于对精度和存储空间的权衡。

为什么 0.1 + 0.2 不等于 0.3?精度误差的根本原因是什么?

0.1 + 0.2 ≠ 0.3 的根本原因是十进制小数在二进制中的表示是无限循环的。0.1 在十进制中是有限小数,但转换为二进制时需要表示为 0.0001100110011...(无限循环)。由于 IEEE 754 单精度只有 23 位尾数位、双精度只有 52 位尾数位,无限循环的二进制表示必须被截断,这就产生了微小的舍入误差。0.1、0.2 和 0.3 各自都有这样的舍入误差,当它们参与加法运算时,误差会累积,导致最终结果与理论值 0.3 存在微小偏差。在 IEEE 754 双精度下,0.1 + 0.2 的实际结果是 0.30000000000000004。这不是编程语言或工具的 bug,而是有限精度表示的本质限制。

指数偏移(Exponent Bias)的作用是什么?

指数偏移是 IEEE 754 中用于存储指数值的编码方式。由于浮点数的指数需要表示正数和负数(如 2^10 和 2^-5),但指数位存储的是无符号整数,因此需要一种编码方式来同时表示正负指数。偏移码的做法是将实际指数加上一个固定的偏移量(单精度为 127,双精度为 1023),然后以无符号整数形式存储。这样,存储值 127 表示实际指数 0,存储值 128 表示实际指数 1,存储值 126 表示实际指数 -1。偏移码的优点是比较指数大小时无需处理符号位,可以直接作为无符号整数比较,简化了硬件比较器的设计。

规格化数、非规格化数、NaN 和 Infinity 分别是什么?

IEEE 754 根据指数位和尾数位的值将浮点数分为四种类型。规格化数:指数位既不全 0 也不全 1,尾数隐含前导 1,用于表示大多数正常数值。非规格化数:指数位全 0,尾数隐含前导 0,用于表示非常接近零的数值,填补规格化数与零之间的空隙。Infinity(无穷大):指数位全 1 且尾数全 0,表示溢出结果或无穷大。NaN(非数字):指数位全 1 且尾数不全 0,表示未定义的运算结果(如 0/0、sqrt(-1))。此外,指数全 0 且尾数全 0 表示正零或负零。这四种类型共同构成了 IEEE 754 的完整数值表示体系。

大端序和小端序在浮点数内存存储中有什么区别?

大端序和小端序描述了浮点数在内存中的字节排列顺序。以 32 位单精度浮点数 0x40490FDB(约等于 π)为例:大端序下内存字节为 40 49 0F DB,即最高有效字节(包含符号位和部分指数位)在最低内存地址;小端序下内存字节为 DB 0F 49 40,即最低有效字节(包含尾数位的低字节)在最低内存地址。x86/x64 处理器使用小端序,网络传输使用大端序(大端序也称为"网络字节序")。本工具同时展示两种字节序的表示,帮助用户理解不同平台下浮点数的内存布局差异。

为什么浮点数有 -0(负零)?它和 +0 有什么区别?

负零(-0)是 IEEE 754 中一个特殊的数值,其符号位为 1,指数位和尾数位全为 0。在大多数算术运算中,-0 和 +0 被视为相等(即 -0 == +0 为真)。但在某些特殊情况下,-0 和 +0 有不同的行为:1/(-0) 结果为 -Infinity,而 1/(+0) 结果为 +Infinity;-0 的符号位为 1,+0 的符号位为 0;在某些舍入模式下,-0 和 +0 可能有不同的表示。负零的存在是为了支持某些数学运算的正确性,例如当一个正数除以正无穷大时,结果应该保留符号信息。