Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly IEEE 754非规范化十进制转换为半点二进制_Assembly_X86_Denormalized - Fatal编程技术网

Assembly IEEE 754非规范化十进制转换为半点二进制

Assembly IEEE 754非规范化十进制转换为半点二进制,assembly,x86,denormalized,Assembly,X86,Denormalized,我正在尝试将0.0000211转换为二进制。以下是我到目前为止的理解: E=-偏差+1。偏差=15,E=-14 符号位和指数=0 因此,我: 百万 半点格式为1个符号位、5个指数位和10个分数位 我的问题是如何找到这个非规范化数的分数?在这种情况下,E和偏见意味着什么?任何帮助都将不胜感激 注意:我需要能够在期末考试中手动执行此操作。半浮点数或双浮点数的尾数(OPs?位)被标准化以删除前导零。通常直到数字为1.0时才执行此操作,因此,不用手动将0.2十进制转换为二进制 从一个程序开始,给我一些以

我正在尝试将0.0000211转换为二进制。以下是我到目前为止的理解:

E=-偏差+1。偏差=15,E=-14

符号位和指数=0

因此,我:

百万

半点格式为1个符号位、5个指数位和10个分数位

我的问题是如何找到这个非规范化数的分数?在这种情况下,E和偏见意味着什么?任何帮助都将不胜感激


注意:我需要能够在期末考试中手动执行此操作。

半浮点数或双浮点数的尾数(OPs?位)被标准化以删除前导零。通常直到数字为1.0时才执行此操作,因此,不用手动将0.2十进制转换为二进制

从一个程序开始,给我一些以10为基数的分数,这可能是一个更好的方法,我发送的链接对整数不起作用

1/2 0.50000000
1/4 0.25000000
1/8 0.12500000
1/16 0.06250000
1/32 0.03125000
1/64 0.01562500
1/128 0.00781250
1/256 0.00390625
因此:

我碰巧知道这个不能用二进制表示,它是一个 重复编号,以便上面告诉我:

0.0011001100110011...
是以10为基数的0.2的二进制数

现在要规范化这个,我需要1.xxxx,所以我向左移动3,得到

1.1001100110011 * 2^(-3)
IEEE 754单精度格式(尾数和分数是相同的)

正数,所以符号s是零

指数是e-127幂的2

所以我们在-3上加上127个偏差,得到124 0x7c

注:由于1.xxxx表示没有理由浪费被移除的1,我们只需将分数放入

0 01111100 10011001100110011001100
0011 1110 0100 1100 1100 1100 1100 1100
0x3E4CCCCC
现在我作弊了,让电脑帮我把它转换成:

0 01111100 10011001100110011001101
0x3E4CCCCD
这是有道理的,因为在我们切掉末端之前,我们有11001个,最后一个被切掉的部分大于或等于我们的基数的一半,所以如果我们想四舍五入,我们就把它四舍五入,这就是1101。当我们有基数10时,我们需要等于或一半的基数,所以5 0.105四舍五入到0.11。所以在二进制中,0.11001取整为0.1101

因此,半点格式似乎是

请参阅

偏差为2^(e-15)

所以我们加15到-3,我们得到12

s是0,它是正的,e是12,m是我假设的,没有隐含的1位 所以

它被截断的地方是一个0,所以它不进行取整,假设采用取整模式

这是0.2的标准化版本,采用16位IEEE浮点格式

现在如果你读了维基百科,它足以理解这一点,如果 当您将其规格化为1.xxxxx时,您将向左移动(如果大于1.xxxx,则向右移动;如果小于1.xxxx,则向左移动,在本例中是这样)一些数字N位,以便您的数字为1.xxxx乘以2^(-N),如维基百科页面所示

Emin = 000012 − 011112 = −14
因此,N为14是最坏的情况,如果必须移位超过14位,则无法对该数字进行规范化。所以他们在维基百科上有这样一个例子,他们称之为次正常和非正常。您将其向左移动14位,这是由2^-14表示的,因此您可以将二进制数转换为0.xxxxxxxxx*2^-14,无论尾数/分数的前十个xxxxx位是什么。编码中的指数是一个特殊的数字00000


因此,0 00000 xxxxxxxxx是IEEE 754半点二进制中非规范化的编码。

我可以在十六进制/二进制/十进制之间进行转换,但我在非规范化数字方面遇到了问题。你是说这和你的链接中描述的方法是一样的吗?谢谢你的评论非规范化是什么意思?意味着您无法将数字标准化为指定格式,该数字太小,以至于当您移动小数点(调整指数)时,在该数字以+/-1.xxxxx二进制形式出现(对于IEEE754)之前,您达到了指数限制。因此,您需要做的第一件事是将其从十进制转换为二进制,然后尝试将其放入任何编码中,不确定如何在不首先将其转换为二进制的情况下从一个十进制转换为另一个编码。如果我想将1234十进制转换为一个字节,我会首先将其转换为0x4D2,然后确定它是否适合一个字节…(在这种情况下,我可以选择大于256的快捷方式)duh,2^16*0.2=13107.2=0x3333右移16是0.001100110011这是快捷方式,谢谢Clayton。。。
seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
0 01111100 10011001100110011001100
0011 1110 0100 1100 1100 1100 1100 1100
0x3E4CCCCC
0 01111100 10011001100110011001101
0x3E4CCCCD
0 01100 1001100110
0011 0010 0110 0110
0x3266
Emin = 000012 − 011112 = −14