Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Floating point MIPS-如何将一组整数转换为单精度浮点_Floating Point_Integer_Mips_Mars Simulator_Single Precision - Fatal编程技术网

Floating point 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单精度格式。

我真的很难想出如何解决这个问题。我得到了我想要的整数和分数的二进制表示,结合它们作为尾数,并将符号位分配到开头,但我不知道如何在MIPS中实际实现它

有人能帮我开始吗

假设您的MIPS硬件没有浮点寄存器和浮点ALU。如果 要执行浮点加法,必须使用使用 整数寄存器($0-$31)和整数ALU来完成任务。在这个作业问题中, 您将只使用整数指令和整数寄存器编写MIPS代码,以实现 过程来添加两个浮点数,并编写一个主函数来调用该过程

  • 编写一个MIPS过程toFloat,将浮点数转换为IEEE单精度格式。 该过程采用三个整数作为输入:$a0、$a1、$a2,表示浮点数 这样:如果$a0包含0,则浮点数为正数;如果$a0包含1,则浮点数为正数 浮点数是负数。存储在寄存器$a1中的数字是 浮点数,存储在寄存器$a2中的数字是浮点数的小数部分 号码。 例如,要表示浮点数-5.25,三个输入寄存器应包含 这些数字:$a0=1、$a1=5和$a2=25。对于分数部分,可以使用div rs rt 指示将25除以100。分数将存储在HI寄存器中,您可以使用 用于检索分数的mfhi指令。 该程序将返回v0,其中包含与 由三个输入数字表示的浮点数。 完成此过程后,可以使用它将输入的数字2.5和7.5转换为它们的值 IEEE单精度格式

  • 编写MIPS过程printFloat以打印IEEE单精度格式的数字。 程序的输入单位为$a0,这是IEEE单精度格式的数字。这个 该过程将只打印存储在$a0中的位模式。您可以使用循环打印每个位。 完成此过程后,您可以使用它以浮点格式打印输入编号2.57.5

  • 编写一个MIPS程序来实现调用程序的主函数。在这个节目中,你 将呼叫

    toFloat(0,2,5)生成2.5的浮点格式

    toFloat(0,7,5)生成7.5的浮点格式

    printFloat到print 2.5

    printFloat到print 7.5

  • 以下是我目前掌握的代码:

    好的,第一步(如注释中所述)是花一些时间在显示位的转换器上,比如这里的转换器:

    然后,简单的部分是获取$a0并将位0转储到结果的位1中。比如:

    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的整数部分为0x0000C000,而$s2以某种方式加载了0.75(1x2^-1+1x2^-2)

    我必须转换$a1 16次:

    $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