浮点数的0和无穷表示法

浮点数的0和无穷表示法



        浮点数的表示随机器的不同而不同,最常见的一种形式是ieee-754标准。这个标准很流行,值得我们深入的研究一下。你可以在你的平台上寻找ieee754.h文件来查看相关信息。
一个ieee-754的float(4 bytes)或者double(8 bytes)由三部分构成(在ieee-854标准下还有一个类似的96bit的扩展精度格式):一个符号位说明这个数是正还是负,一个指数给出了它的数量级和一个尾数给出了实际的数字。用单精度浮点数(float)作为例子,下面是它的位结构。
seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
31                              0    bit #

        s = 符号位, e = 指数, m = 尾数

        这个数的值是尾数的2的x次方倍,这里的x是上面的eeeeeee,即指数。注意我们正在处理的是二进制片段,做好二进制,十进制,十六进制互相转换的准备。
对于存储尾数和指数存在一个潜在的问题:2x10^-1 = 0.2x10^0 = 0.02x10^1等。这对于同一数字将导致许多不同的位模式表示方式,并且因此可能造成巨大的浪费(可能使硬件实现数学运算变得困难并且变慢),因为此时一个数可能会有很多种表示方式。这个问题可以通过将尾数解释为小数点后面的部分并且隐含的在小数点的前面是1这种方式来解决(二进制)。现在将这种方式称为\"1.m\"表示法。比如尾数1000表示1.1000,也就是十进制的1.5,在后面将给出实际的例子,有助于理解。尾数部分决定了以后,剩下的工作就是设置正确的指数部分来重新构造原来的数。

        但是0怎么办?ieee标准委员会将0看做一种特殊情况:忽略符号位如果每一位都是0,那么这个数被看做0.

        到现在,看上去我们还没有办法表示比1.0小的数(注:因为全是0的方案被0这个数占据了)。解决的方法是不直接解释指数位。一个单精度的浮点数采用\"shift-127\"编码,意思是实际的指数是eeeeeeee减掉127.也就是将eeeeeeee看做有符号的数。

         0不是唯一的特殊情况的浮点数。还有正无穷、负无穷和非数字值。这些是如何表示的?如果指数的每一位都被设置,那么这个数就被认为是无穷大的,如果指数位的每一位都被设置,并且尾数位的任意一位被设置,那么这个数被定义为nan.对上面的数来说,符号位仍然是有效的。可以是正也可以是负无穷,可以是正nan,也可以使负nan.

你可能感兴趣的:(工作)