Matlab表示浮点数

时间:2016-02-07 21:18:37

标签: matlab binary floating-point

realmax('single')的matlab结果是ans = 3.4028e + 38。我试图理解为什么这个数字出现在计算机的二进制表示中,但我有点困惑。

我知道realmax('single')是单个percision中表示的最高浮点数,即32位。这意味着二进制表示由符号的1位,尾数的23位和指数的8位组成。并且3.4028e + 38是最高单精度浮点数的十进制表示,但我不知道该数字是如何导出的。

现在,输入2 ^ 128给出了与3.4028e + 38相同的答案,但我不明白相关性。

可以帮助我理解为什么3.4028e + 38是32位格式的浮点数的最大返回结果,来自二进制表示的角度?谢谢。

2 个答案:

答案 0 :(得分:3)

IEEE754所示,最大幅度指数为E max = 127 10 = 7F 16 = 0111 1111 2 。这被编码为8个指数位中的254 10 = FE 16 = 1111 1110 2 。指数255 10 = FF 16 = 1111 1111 2 保留用于表示无穷大,因此254 10 是最大可用。从指数位中减去指数偏差127 10 ,导致254 10 -127 10 = 127 10 。当所有23个尾数位都设置为1时,获得最大的尾数。可以表示的最大值是1.11111111111111111111111 2 x2 127 = 3.4028235 10 X10 38

site允许您设置表示的位,并查看以十进制,二进制和十六进制表示的IEEE754值。

另请注意,最大值小于2 ^ 128。通过使用format long,您可以在MATLAB中看到更精确的数字输出表示。他们相似的原因是因为1.11111111111111111111111 2 x2 127 接近10 2 x2 127 = 1 2 X2 128

答案 1 :(得分:1)

作为计算机中数字的单精度二进制浮点表示的前兆,我首先讨论十进制数的所谓“科学记数法”。

使用基数为10的数字系统,每个正十进制数在集合{1..9}中具有第一个非零前导数字。 (所有其他数字都在集合{0..9}中。)数字的小数点可以总是通过乘以数字基数10的适当功率10 ^ n而转移到该前导数字的右边。 0.012345 = 1.2345 * 10 ^ n其中n = -2。这意味着每个非零数字x的十进制表示可以采用

形式
    x = (+/-)(i.jklm...)*10^n ; where i is in the set {1,2,3,4,5,6,7,8,9}.

前导小数因子(i.jklm ...),称为x的“尾数”,是区间[1,10)中的数字,即大于或等于1且小于10。最大的尾数可以是9.9999 ...因此数字x的实际“大小”是存储在指数因子10 ^ n中的整数。如果数字x非常大,则n>&gt; 0,而如果x非常小,则n <&lt; 0.

我们现在想要使用与计算机存储数字相关联的基数2系统重新审视这些想法。计算机在内部使用基数2而不是更熟悉的基数10表示数字。数字的“二进制”表示中使用的所有数字都属于集合{0,1}。使用相同的思维方式在二进制表示中表示x,就像我们在十进制表示中所做的那样,我们看到每个正数x都具有形式

    x = (+/-)(i.jklm...)*2^n ; where i = 1, 

,其余数字属于{0,1}。

这里,前导二进制因子(尾数)i.jklm ...位于区间[1,2]中,而不是与十进制系统中的尾数相关的区间[1,10]。这里尾数由二进制数1.1111 ...限定,它总是小于2,因为在实践中永远不会有无限数量的数字。如前所述,数字x的实际“大小”存储在整数指数因子2 ^ n中。当x非常大时,则n>&gt;当x非常小时,n <&lt;指数n用二进制十进制表示。因此,x的二进制浮点表示中的每个数字都是0或1.每个这样的数字是计算机存储器中用于存储x的“位”之一。

x的(单精度)二进制表示的标准约定是通过在计算机存储器中精确存储32位(0或1)来实现的。第一位用于表示数字的算术“符号”。这留下31比特分布在x的尾数(i.jklm ...)和指数因子2 ^ n之间。 (在i.jklmn中重新调用i = 1 ...因此其表示中不需要31位。)此时,重要的“权衡”开始发挥作用:

专用于x的尾数(i.jkl ...)的位越多,在指数因子2 ^ n中表示指数n的可用性就越少。通常,23比特专用于x的尾数。 (当在十进制系统中考虑时,不难表明这允许大约7位数的精度,这对于大多数科学工作来说是足够的。)第一位专用于存储x的符号,这留下了8位可以用来表示因子2 ^ n中的n。由于我们希望允许非常大的x和非常小的x,因此决定以2 ^ n的形式存储

    2^n = 2^(m-127) ; n = m - 127,

其中存储指数m而不是n。利用8位,这意味着m属于二进制整数集{000000,00000001,.... 11111111}。由于人类更容易在十进制系统中思考,这意味着m属于值{0,1,... 255}的集合。减去-127,这意味着2 ^ n又属于数字集{-127,-126,... 0,1,2 ... 128},即

    -127 <= n <= 128. 

我们的x的二进制浮点表示的指数因子2 ^ n的最大值可以是2 ^ n = 2 ^ 128,或者在十进制系统中查看(使用任何计算器来评估2 ^ 128)

                     2^n <= 3.4028...*10^38.

总结一下,在IEEE格式下计算机中可能以单精度浮点存储的最大数字x是一个数字

                    x = y*(3.4028...*10^38).

这里的尾数y位于(半闭,半开)区间[1,2]。

为简单起见,Matlab将“​​最大”可能浮点数的“大小”报告为指数因子2 ^ 128 = 3.4028 * 10 ^ 38的最大大小。从这个讨论中我们看到,使用32位二进制浮点表示可以存储的最大浮点数实际上加倍到max_x = 6.8056 * 10 ^ 38。