浮点类型(例如,Single和Double)在内存中由符号,尾数和指数表示。将其视为科学计数法:
Sign*Mantissa*Base^Exponent
正如您所期望的那样,它们使用基数2。还有其他一些调整可以表示无穷大和NaN,并且指数是偏移的(将返回到该值),并且尾数的一种缩写(也将返回到该值) 。寻找有关其表示和操作的标准IEEE 754,以获取更多详细信息。
出于我们的目的,我们可以将其想象成一个二进制数字“尾数”和一个“指数”,告诉您将小数点放在哪里。
在Single的情况下,他的符号为1位,指数为8位,尾数为23位。
现在,问题是,我们将从最高有效位开始存储尾数。请记住,左边的所有零都不相关。考虑到我们使用二进制工作,我们知道最高有效数字是1※。好吧,由于我们知道这一点,所以我们不必存储它。由于该缩写,尾数的有效范围是24位。
※:除非我们存储的数字为零。为此,我们将所有位设置为零。但是,如果我们尝试按照我给出的描述来解释,您将有一个2 ^ 24(隐式1)乘以1(2为指数0的幂)。因此,要解决此问题,指数零是一个特殊值。还有一些特殊值可存储指数中的无穷大和NaN。
根据指数偏移量(除了避免使用特殊值外),让其偏移量允许将小数点放置在尾数开头之前或尾数结尾之后,而无需为指数指定符号。
这意味着对于大数,浮点类型会将小数点放在尾数末尾之外。
请记住,尾数是24位数字。它永远不会代表25位数字...它没有多余的位。因此,单身人士无法区分2 ^ 24和2 ^ 24 + 1(这是前25位数字,而他们在最后一位上有所不同,这在单身人士中没有体现)。
因此,对于整数,单数的范围是-2 ^ 24到2 ^ 24。尝试将1加到2 ^ 24将导致2 ^ 24(因为就类型而言,2 ^ 24和2 ^ 24 + 1是相同的值)。在线试用。这就是为什么从整数转换为单数时会丢失信息的原因。这也是为什么在不引起您注意的情况下,使用一个或一个双精度循环实际上可能是无限循环的原因。