Floating point MIPS-如何将一组整数转换为单精度浮点
我真的很难想出如何解决这个问题。我得到了我想要的整数和分数的二进制表示,结合它们作为尾数,并将符号位分配到开头,但我不知道如何在MIPS中实际实现它 有人能帮我开始吗 假设您的MIPS硬件没有浮点寄存器和浮点ALU。如果 要执行浮点加法,必须使用使用 整数寄存器($0-$31)和整数ALU来完成任务。在这个作业问题中, 您将只使用整数指令和整数寄存器编写MIPS代码,以实现 过程来添加两个浮点数,并编写一个主函数来调用该过程Floating point MIPS-如何将一组整数转换为单精度浮点,floating-point,integer,mips,mars-simulator,single-precision,Floating Point,Integer,Mips,Mars Simulator,Single Precision,我真的很难想出如何解决这个问题。我得到了我想要的整数和分数的二进制表示,结合它们作为尾数,并将符号位分配到开头,但我不知道如何在MIPS中实际实现它 有人能帮我开始吗 假设您的MIPS硬件没有浮点寄存器和浮点ALU。如果 要执行浮点加法,必须使用使用 整数寄存器($0-$31)和整数ALU来完成任务。在这个作业问题中, 您将只使用整数指令和整数寄存器编写MIPS代码,以实现 过程来添加两个浮点数,并编写一个主函数来调用该过程 编写一个MIPS过程toFloat,将浮点数转换为IEEE单精度格式。
add $v0, $zero, $zero # initialize our result
sll $t0, $a0, 31 # shift the lsb to the msb
or $v0, $v0, $t0 # set the sign bit in the result
但现在我们得做数学了。我希望$a1是整数部分,而$a2是二进制小数部分。但不是那样的。。。他们说$a1是整数(二进制中仍然是整数),但实际上$a2是美分。(如果25/100=0.25十进制,则$a2包含美分。)
这就是我自己感到困惑的地方。指令上写着“使用div rs rt指令将25除以100。分数将存储在HI寄存器中”。但是当我读到div
does()时,它说它把商放在$LO中,其余的放在$HI中。所以25除以100会得到。。。25这是一个丢弃大于100的数量的好方法,但它不能使我们得到这个数字的二进制分数表示
事实上,我花了整整一节课加上午餐,试图找出一种优雅的方法,将一个介于0和99之间的数字除以100,然后将结果转换为二进制,而不使用FPU。我差一点。所以我让你问教授关于那部分的问题
但是一旦我们有了$a1中的整数部分,以及表示小数部分的1和0的字符串(让我们把它放在$s2中),我们只需要对其进行规范化。我们在$a1
$s2
中有一个数字,我们需要它采用以下格式:
1.nnnnnnn
。。。我们从1开始,然后分数部分是多少个二进制数字
下面是一些可能有效的伪代码
- 向左移动$a1,直到msb为“1”。以$t0为单位存储班次数。(注意:这假设整数部分为非零)
- (31-$t0)给出指数。根据偏差进行调整,并填入浮点结果的第30-23位
- $t0还告诉您有多少空间容纳小数位。将$s2移位一个适当的量(这取决于它的编码方式),然后
或
将其移位,以便它填充$a1的最低有效位
- 移位$a1再左移一位,因为前导的“1”在IEEE FP中被丢弃
- 将$a1的前23位填入浮点结果的第22-0位
$a1: 1100 0000 0000 0000 0000 0000 0000 0000
这应该给我一个31-16=15的指数。加上127的偏差,我得到142(0x8E)。在指数部分
我需要将$s2向右移动相同的金额(16):
或
这些组合:
$a1: 1100 0000 0000 0000 1100 0000 0000 0000
用小数点表示:
original: 1100 0000 0000 0000.1100 0000 0000 0000
normaliz: 1.100 0000 0000 0000 1100 0000 0000 0000
因为我们省略了小数点左边隐含的“1”,将其移出,我们得到:
$a1: 100 0000 0000 0000 1100 0000 0000 0000 0
拿23块。因此,如果我正确的话,上面的转换器应该说49152.75在IEEE FP中存储为:
01000111 01000000 00000000 11000000
标志
$a1: 100 0000 0000 0000 1100 0000 0000 0000 0
01000111 01000000 00000000 11000000