2014-06-12 25 views
0

我已經凝結了我的問題下面的代碼:的Mips雙師傳回無限

.data 

newline: .asciiz "\n" 

.text 
.globl main 

main: 

li $t0, 4 
li $t1, 16   

mtc1 $t0, $f2  # Two integers get stored as floats 
mtc1 $t1, $f30 

div.d $f12, $f2, $f30 

li $v0, 3 
syscall   # First division works, returns 0.25 

la $a0, newline 
li $v0, 4 
syscall   # prints new line 

div.d $f12, $f12, $f30 

li $v0, 3 
syscall   # Second division doesn't work as expected, returns Infinity 

輸出是:

0.25 

Infinity 

這是爲什麼?我期望0.25/16是〜0.015625,而不是Infinity

的$ F12的第一個值:0x3fd0000000000000 的$ F12的第二個值:0x7ff0000000000000

我是比較新的MIPS所以它可能是容易的。 感謝您的任何答案!

+0

它看起來像你在德乙一個錯字:div.d $ F12,F12 $,$ F30。你永遠不會顯示$ f12被初始化,我懷疑它包含零。 – Durandal

+0

不應該包含'div.d $ f12,$ f2,$ f30'之後的東西嗎?或者打電話打印時它會被覆蓋? – Nicola

+2

「MTC1」指令不會將整數轉換爲雙精度型。移動後您需要使用'CVT.D.W'。 – markgz

回答

3

第一部分的顯而易見的成功是由於一個人造的小正整數和正低於正常的雙數表示。兩者都具有前導零,二進制位模式對應於最低有效位中值的有效位。將整數視爲雙精度的效果是將每個值除以2得到1074的值。

儘管f2和f30(被視爲雙精度浮點數)包含約2.0E-323和7.9E-323的微小值,他們的比例與4/16相同。將一箇中等數字(如0.25)分成一小部分溢出到無窮大。

下面是一個簡短的Java程序說明這一點:

public class Test { 
    public static void main(String[] args) { 
    long t0 = 4; 
    long t1 = 16; 
    double f2 = Double.longBitsToDouble(t0); 
    double f30 = Double.longBitsToDouble(t1); 
    System.out.println("f2=" + f2); 
    System.out.println("f30=" + f30); 
    double f12 = f2/f30; 
    System.out.println("f12=" + f12); 
    System.out.println("f12/f30=" + f12/f30); 
    } 
} 

輸出:

f2=2.0E-323 
f30=7.9E-323 
f12=0.25 
f12/f30=Infinity 
+0

這是一個很好的答案!這是多個錯誤如何互相抵消的一個很好的例子。 – markgz

+0

謝謝你,很好的答案。 – Nicola

+0

謝謝!非常好的答案 – Ahmad