floating-point浮点入门


备注

本节概述了浮点是什么,以及开发人员可能想要使用它的原因。

它还应该提到浮点内的任何大型主题,并链接到相关主题。由于浮点文档是新的,您可能需要创建这些相关主题的初始版本。

概观

浮点是什么?

有两种类型的数字:

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

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

  • 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格式的细节可以在以下位置找到: