首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浮点数的Matlab表示

浮点数的Matlab表示
EN

Stack Overflow用户
提问于 2016-02-07 21:18:37
回答 1查看 972关注 0票数 0

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

据我所知,realmax(' single ')是单个圆环切割中表示的最高浮点数,也就是32位。这意味着二进制表示由符号1位、尾数23位和指数8位组成。3.4028e+38是最高单精度浮点数的十进制表示,但我不知道这个数字是如何推导出来的。

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-02-08 19:05:04

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

使用基数10的数字系统,每个正十进制数在集合{1..9}中有第一个非零前导数字。(所有其他数字都在集合{0..9}中。)这个数字的小数点可能总是移到这个前导数字的右边,方法是将数字基数10的10^n乘以适当的幂,例如0.012345 = 1.2345*10^n,其中n= -2。这意味着每个非零数x的十进制表示形式都可以采用以下形式。

代码语言:javascript
复制
    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 >> 0,如果x是很小的n << 0。

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

代码语言:javascript
复制
    x = (+/-)(i.jklm...)*2^n ; where i = 1, 

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

这里主要的二元因子(尾数)i.jklm.位于区间[1,2]中,而不是与十进制中尾数相关联的区间[1,10]。这里尾数由二进制数1.1111.有界,它总是小于2,因为在实际中永远不会有无穷多的数字。和以前一样,数字x的实际“大小”存储在整数指数因子2^n中。当x非常大时,n >> 0和x是非常小的n << 0。指数n用二进制十进制表示。因此,x的二进制浮点表示中的每一个数字要么是0,要么是1。每个数字都是计算机内存中用于存储x的“位”之一。

X的(单精度)二进制表示的标准约定是通过在计算机内存中精确存储32位(0或1)来完成的。第一位用来表示数字的算术“符号”。这将在尾数(i.jklm.)之间分配31位。和指数因子2^n。(回忆I=1在i.jklmn.因此,它的表示不需要31位。)在这一点上,一个重要的“权衡”发挥了作用:

用于尾数的比特数越多(i.jkl.)在x中,用指数因子2^n表示指数n的次数越少。按照惯例,有23位用于x的尾数。(不难看出,在十进制系统中,它允许大约7位数字的精度,这对于大多数科学工作来说是足够的。)由于第一位专用于存储x的符号,所以剩下8位可以用来表示因子2^n中的n,因为我们希望允许非常大的x和非常小的x,所以决定以这种形式存储2^n。

代码语言:javascript
复制
    2^n = 2^(m-127) ; n = m - 127,

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

代码语言:javascript
复制
    -127 <= n <= 128. 

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

代码语言:javascript
复制
                     2^n <= 3.4028...*10^38.

概括地说,可以在计算机中以IEEE格式存储在单精度浮点中的最大数字x是表单中的数字。

代码语言:javascript
复制
                    x = y*(3.4028...*10^38).

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35259238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档