概述

浮点是什么?

有两种类型的数字:

  • 在小数点之前和之后可以获得一定数量的数字的固定点。
  • 浮点数,其中有一定数量的数字可用于尾数和指数。

使用小数点前三位小数和小数位后两位小数的小数位的示例:

  • 0 表示为 000.00
  • 0.123 将表示为 000.12
  • 0.00123 将表示为 000.00
  • 1 表示为 001.00
  • 1.123 将表示为 001.12
  • 1.00123 将表示为 001.00
  • 123.456 将表示为 123.45
  • 1234.56 是一个错误,因为它将被存储为 234.56,这是错误的

使用十进制数字的示例,尾数为五位小数,指数为小数点后一位:

  • 0 可以表示为 .00000 x 10 ^ 0
  • 0.1 可以表示为 .10000×10 ^ 0
  • 0.0000123456 可表示为 .12345 x 10 ^ -4
  • 0.000000000123456 可表示为 .12345 x 10 ^ -9
  • 0.00000000001 是一个错误,因为指数不足以存储数字
  • 1 可以表示为 .10000 x 10 ^ 1
  • 1.123 可以表示为 .11230 x 10 ^ 1
  • 1.00123 可以表示为 .10012 x 10 ^ 1
  • 123.45678 可以表示为 .12345 x 10 ^ 2
  • 123456789.1 可以表示为 .12345 x 10 ^ 9
  • 1000000000 是一个错误,因为指数不足以存储数字

因此,浮点数可以表示具有非常不同大小的数字(0.000000000123456 和 123456789.1),具有相同的相对精度。

当始终需要特定数量的小数位时,无论数字的大小(例如金钱),定点数都很有用。当幅度变化且仍需要精确度时,浮点数很有用。例如:对于道路工程师而言,距离以米为单位测量,而 .01 米的距离是微不足道的,但对于微芯片设计师而言,0.0000001 米和 .000000001 米之间的差异是巨大的 - 物理学家可能需要使用大量的数据而且非常非常同一计算中的微小数字。许多不同大小的准确度使得浮点数有用。

这个怎么运作

计算机不使用十进制 - 它们使用二进制并导致浮点问题,因为并非每个十进制数都可以用浮点数精确表示,并且会在计算中引入舍入误差。

以十进制完成所有示例之后,请务必注意,因为它们是二进制的,而不是将浮点数存储为小数部分的总和:

123.875 = 1/10^-2 + 2/10^-1 + 3/10^0 + 8/10^1 + 7/10^2 + 5/10^3

计算机将浮点数存储为二进制分数的总和:

123.875 = 1/2^-6 + 1/2^-5 + 1/2^-4 + 1/2^-3 + 1/2^-1 + 1/2^0 + 1/2^1 + 1/2^2 + 1/2^3

有许多不同的方法可以存储代表这些分数的位图,但现在大多数计算机使用的是基于 IEEE-754 标准。它具有存储十进制和二进制表示以及不同大小数据类型的规则。

使用 IEEE 标准存储正常数字的方式是:

  • 符号的一位 - 存储在 MSB 中,1 表示负数,0 表示正数
  • 指数的一些位 - 减去偏差以得到正指数和负指数
  • 尾数的一些位 - 小数位后面的数字,小数位前面有一个隐含的 1。

为了允许更渐进的下溢,非规格化数字(当指数位全为零时)被特别处理:指数设置为 -126 并且小数位之前的隐式前导 1 不被添加到尾数。

32 位 IEEE-754 浮点数

对于普通的 32 位 IEEE-754 浮点数:

  • 第 32 位是标志
  • 位 24-31 是指数 - 偏差是 127
  • 位 1-23 是尾数

所以正常数字计算如下:

-1^sign * 2^(exponent-bias) * 1.mantissa

如果位模式是:

0 10000101 11101111100000000000000

然后价值是:

-1^0 * 2^(133-127) * 1.111011111
-1^0 *     2^6     * (1 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256 + 1/512)
   1 *      64     * 991/512
         123.875

有一些特殊的值:

0 11111111 11111111111111111111111 = NaN
0 11111111 00000000000000000000000 = +infinity
1 11111111 00000000000000000000000 = -infinity
0 00000000 00000000000000000000000 = +Zero
1 00000000 00000000000000000000000 = -Zero

32 位 IEEE-754 格式的细节可以在以下位置找到: