4.4.1. 基本数据类型

ARM 浮点值存储在以下两种数据类型之一中:单精度双精度。 在本文档中,这些类型称为 floatdouble。 这些是相应的 C 类型。

单精度

float 值为 32 位宽。 其结构显示在Figure 4.3 中。

Figure 4.3. IEEE 754 单精度浮点格式

IEEE 754 单精度浮点格式

S 字段给出一个数的符号。 0 表示正数,1 表示负数。

Exp 字段给出一个数的指数,该指数是 2 的幂。 其偏移为0x7F (127),以使很小的数的指数接近于零,很大的数的指数接近于 0xFF (255)。

因此,举例来说:

  • 如果 Exp = 0x7D (125),则数在 0.25 和 0.5 之间(不包括 0.5)

  • 如果 Exp = 0x7E (126),则数在 0.5 和 1.0 之间(不包括 1.0)

  • 如果 Exp = 0x7F (127),则数在 1.0 和 2.0 之间(不包括 2.0)

  • 如果 Exp = 0x80 (128),则数在 2.0 和 4.0 之间(不包括 4.0)

  • 如果 Exp = 0x81 (129),则数在 4.0 和 8.0 之间(不包括 8.0)。

Frac 字段给出数的小数部分。 通常,它前面带有一个隐式 1 位,不会存储此位以节省空间。

因此,举例来说,如果 Exp0x7F

  • 如果 Frac = 00000000000000000000000(二进制),数为 1.0

  • 如果 Frac = 10000000000000000000000(二进制),数为 1.5

  • 如果 Frac = 01000000000000000000000(二进制),数为 1.25

  • 如果 Frac = 11000000000000000000000(二进制),数为 1.75

因此,在通常情况下,采用这种格式的位模式数值由下面的公式给出:

(-1)S * 2(Exp-0x7F) * (1 + Frac * 2-23)

使用这种格式存储的数称为规格化 数。

最大指数值 255 和最小指数值 0 是特例。 指数 255 用于表示无穷大并存储非数字 (NaN) 值。 无穷大是指除以零的结果,或者是计算的值太大而不能用这种格式存储的结果。 NaN 值用于特殊用途。 可通过将 Exp 设置为 255 而将 Frac 设置为全零来存储无穷大。 如果 Exp 是 255 而 Frac 不为零,则位模式表示 NaN。

指数 0 用于以特殊方式表示很小的数。 如果 Exp 为零,则 Frac 字段前面没有隐式 1。 这意味着,该格式可通过将 ExpFrac 均设置为全零位来存储 0.0。 这还意味着,太小而不能用 Exp >= 1 存储的数用低于普通 23 位的精度进行存储。 这些数称为非正规数

双精度

double 值为 64 位宽。Figure 4.4 显示了其结构。

Figure 4.4. IEEE 754 双精度浮点格式

IEEE 754 双精度浮点格式

与前面一样,S 是符号,Exp 是指数,而 Frac 是小数。 在大多数讨论中,float 值保持为真,除非:

  • Exp 字段偏移为 0x3FF (1023),而不是 0x7F,因此,1.0 和 2.0 之间的数的 Exp 字段偏移为 0x3FF

  • 用于表示无穷大和 NaN 的 Exp 值是 0x7FF (2047) 而不是 0xFF

示例值

本节提供了示例浮点值:

单精度浮点值

Table 4.14 中给出了一些示例 float 位模式及其数学值。

Table 4.14. 示例单精度浮点值

浮点值 S Exp Frac 数学值 注释[1]
0x3F800000 0 0x7F 000...000 1.0 -
0xBF800000 1 0x7F 000...000 -1.0 -
0x3F800001 0 0x7F 000...001 1.000 000 119 a
0x3F400000 0 0x7E 100...000 0.75 -
0x00800000 0 0x01 000...000 1.18*10-38 b
0x00000001 0 0x00 000...001 1.40*10-45 c
0x7F7FFFFF 0 0xFE 111...111 3.40*1038 d
0x7F800000 0 0xFF 000...000 正无穷大 -
0xFF800000 1 0xFF 000...000 负无穷大 -
0x00000000 0 0x00 000...000 0.0 e
0x7F800001 0 0xFF 000...001 信号 NaN f
0x7FC00000 0 0xFF 100...000 无提示 NaN f

[1] 有关详细信息,请参阅示例浮点值注释

双精度浮点值

Table 4.15 中给出了一些示例 double 位模式及其数学值。

Table 4.15. 示例双精度浮点值

双精度值 S Exp Frac 数学值 注释[1]
0x3FF00000 00000000 0 0x3FF 000...000 1.0 -
0xBFF00000 00000000 1 0x3FF 000...000 -1.0 -
0x3FF00000 00000001 0 0x3FF 000...001 1.000 000 000 000 000 222 a
0x3FE80000 00000000 0 0x3FE 100...000 0.75 -
0x00100000 00000000 0 0x001 000...000 2.23*10-308 b
0x00000000 00000001 0 0x000 000...001 4.94*10-324 c
0x7FEFFFFF FFFFFFFF 0 0x7FE 111...111 1.80*10308 d
0x7FF00000 00000000 0 0x7FF 000...000 正无穷大 -
0xFFF00000 00000000 1 0x7FF 000...000 负无穷大 -
0x00000000 00000000 0 0x000 000...000 0.0 e
0x7FF00000 00000001 0 0x7FF 000...001 信号 NaN f
0x7FF80000 00000000 0 0x7FF 100...000 无提示 NaN f

[1] 有关详细信息,请参阅示例浮点值注释

示例浮点值注释
a

可看作大于 1.0 的最小可表示数。 该数与 1.0 之间的差值称为机器最小数float 中为 0.000 000 119,double 中为 0.000 000 000 000 000 222。 可以从机器最小数中大致了解该格式可以记录的有效数字个数。float 可以包含 6 或 7 位。double 可以包含 15 或 16 位。

b

可以在每种格式中表示为规格化数的最小值。 比该值小的数可存储为非正规数,但不能以相当的精度进行存储。

c

可与零相区分的最小正数。 这是该格式的绝对下限。

d

可存储的最大有限数。 如果尝试通过相加或相乘增大此数,则会导致溢出并生成无穷大(通常情况下)。

e

零。 严格地说,它们表示正零。 尽管比较运算(如 ==!=)报告这两种类型的零相等,但一些运算以不同方式处理符号位为 1 的零(负零)。

f

共有两种类型的 NaN:信号 NaN 和无提示 NaN。 对于无提示 NaN,Frac 的第一位是 1;对于信号 NaN,Frac 的第一位是 0。 差别在于,信号 NaN 导致出现异常(请参阅异常),而无提示 NaN 不会导致出现异常。

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0349AC
Non-Confidential