浮点数是一种用于表示实数的数值表示形式,它使计算机能够处理非常大的或非常小的数值。例如,在科学计算中,我们经常需要处理像 6.022 × 10^23 这样的数字,使用浮点数表示可以极大地提高计算的灵活性和效率。

浮点数允许计算机表示范围远超整数,适用于处理科学、工程和财经等领域中大范围数值。浮点数的形式化定义如下:
浮点数可以表示为:


例如,我们想表示数值 -6.75,可以将其分解为:
6.75 可以表示为二进制 110.11,规范化为 1.1011 × 2^2。2 + 127 = 129,其二进制表示为 10000001。最终,-6.75的单精度浮点数表示为:
登录后复制
1 | 10000001 | 10110000000000000000000在计算机内存中,浮点数以二进制方式存储:
因为尾数位数增加,双精度浮点数的表示范围和精度都要高于单精度浮点数。
IEEE 754支持不同的浮点格式,包括但不限于:

IEEE 754采用偏移量表示法来存储指数值。这意味着实际二进制指数值需要加上一个常数(偏移量),以便能表示负值。例如:
这种方法使得可以用无符号整型存储负数的指数。
例如:
1010.101 规范化为 1.010101 × 2^3,指数 E = 3。例如:
例如:
10000010(对于单精度)。例如:
1.010101,尾数为 010101,后面补 0 补齐到 23 位。例如,对于一个负数 -10.625,转换为 IEEE 754 单精度的过程如下:
-10.625 = -1010.101。1.010101 × 2^3。10000010。01010100000000000000000。1 10000010 01010100000000000000000。在浮点数运算中,舍入至关重要,因为任何非精确的小数都需要处理。IEEE 754标准定义了多个舍入模式:
这一模式是IEEE 754的默认舍入方式。它会将结果舍入到最接近的可表示的数值。如果结果正好位于两个可表示数之间,则选择尾数为偶数的那个数。
示例
考虑将数字 2.5 舍入到最接近的单精度浮点数:
2.5 在二进制中为 10.1。它的最近可表示的浮点数是 3.0 (11.0) 和 2.0 (10.0)。2.5 在两个数之间,最终结果应该舍入到 2(即 10.0)并保持尾数为偶数。另一个例子:
3.5 舍入为偶数的可表示数位受限于 3.0 和 4.0(11.0 和 100.0),因此最终结果是 4.0。这一模式始终舍弃小数部分,而只是简单地保留整数部分。这种方式计算结果每次都向零方向靠拢。
示例
3.7,向零舍入将结果变为 3.0。-3.7,结果则变为 -3.0。此模式不考虑后续的数字,因此有时可能导致小数部分的丢失。
这种模式总是向上舍入。无论是正数还是负数,都将结果“提升”到下一个可表示的数值。
示例
3.2,向正无穷舍入结果为 4.0。-3.2,在向正无穷舍入的过程中,会得到 -3.0。向正无穷舍入的特点是无论数值的符号如何,结果总是朝着绝对值较大的方向。
这种模式总是向下舍入。无论是正数还是负数,其结果总是“降低”到下一个可表示的数值。
示例
3.7,向负无穷舍入结果为 3.0。-3.7,结果则会舍入至 -4.0。这种舍入方式有助于处理一些需要保持保守估计的场合,尤其在金融领域比较常见。
这些不同的舍入模式确保在浮点运算中选择合适的方法处理结果,有助于减少误差。
IEEE 754标准定义了浮点运算中的多种异常情况及其应对方式,包括:
0/0操作会产生一个“不是一个数字”的状态,帮助程序避免继续进行后续计算。
尽管IEEE 754标准规范了浮点数的表示与运算,但仍存在显著的局限性:
由于尾数位数有限,某些数值无法被精确表示。例如,十进制数 0.1 在二进制中是一个无限的循环小数。浮点计算经常会导致累积误差:
登录后复制
a = 0.1 + 0.2
print(a) # 结果通常不会是 0.3,而是一个接近 0.3 的值。IEEE 754浮点数能够表示的数值范围是有限的。单精度浮点数的最大值约为 3.4 × 10^38,处理更大范围数值时,必须使用双精度浮点数。溢出会导致错误,因此在开发软件时要谨慎。
浮点运算通常比整数运算慢得多,还有额外的存储开销,尤其在资源有限的嵌入式系统中,这可能会造成性能瓶颈。