浮点数/规范化
您可能已经熟悉了浮点数的科学或指数表示法中的大多数概念。例如,数字 123456.06 可以用指数表示法表示为 1.23456e+05,这是一种简写表示法,表示尾数 1.23456 乘以基数 10 的 5 次方。
更正式地说,浮点数的内部表示可以用以下参数来表征:符号可以是 -1 或 1。指数的基数或底,是一个大于 1 的整数。对于特定表示,这是一个常数。指数,底数被提升到的幂。指数值的上下限是特定表示的常数。
有时,在实际表示浮点数的位中,指数会通过添加一个常数来进行偏差,以使其始终被表示为无符号量。只有在您有某些理由手动拆解构成浮点数的位字段时,这才是重要的,而 GNU 库对此没有提供任何支持。因此,在接下来的讨论中,我们将忽略这一点。尾数或有效数字是一个无符号整数,是每个浮点数的一部分。尾数的精度。如果表示的基数是 b,则精度是指尾数中 base-b 位的数量。对于特定表示,这是一个常数。
许多浮点表示在尾数中都有一个隐式的隐藏位。这是一个实际上存在于尾数中的位,但没有存储在内存中,因为它在规范化的数字中始终为 1。精度数字(见前文)包括任何隐藏位。
同样,GNU 库不提供任何用于处理此类低级表示方面的工具。浮点数用于增强表示范围
浮点数的尾数表示一个隐式分数,其分母是基数的精度次方。由于最大的可表示尾数比此分母(基数的精度次方)小 1,因此分数的值始终严格小于 1。浮点数的数学值然后是这个分数、符号和基数的指数的乘积。
如果分数至少为 1/b,其中 b 是基数,则我们说浮点数是规范化的。换句话说,如果尾数乘以基数,则会太大而无法容纳。非规范化的数字有时被称为非规格化;它们包含的精度低于表示通常可以容纳的精度。
如果数字不是规范化的,则可以从指数中减去 1,同时将尾数乘以基数,并获得另一个具有相同值的浮点数。规范化包括重复执行此操作,直到数字被规范化。两个不同的规范化浮点数在值上不能相等。
(此规则有一个例外:如果尾数为零,则它被认为是规范化的。另一个例外发生在某些机器上,其中指数与表示可以容纳的最小指数一样小。然后,不可能从指数中减去 1,因此即使其分数小于 1/b,数字也可能是规范化的。)