---
# System prepended metadata

title: Lab 7

---

# Lab 7
Name: M Akash
Roll No.: CS22B037

---
## Question 1

_0.1 to binary_
0.1 * 2 = 0.2 -> 0 (integer part)
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
.
.
.
.

So, the binary approximation of 0.1(decimal) is 0.000110011001....

---
## Question 2
_0.1 to binary using IEEE754 Single Precision_

Total Sign bits = 1
Total Exponent bits = 8
Total Mantissa bits = 23

For 0.1, 0.1(decimal) will be represented as 1.100110011001 * 2^(-4)
S = 0 [since positive]
E = 01111011   [since -4+127 = 123]
M = 10011001100110011001100   [after decimal point]

---
## Question 3
_0.2 to binary_
0.2 * 2 = 0.4 -> 0 (integer part)
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
So, the binary approximation of 0.2(decimal) is 0.00110011001....

_0.2 to binary using IEEE754 Single Precision_
For 0.2, 0.2(decimal) will be represented as 1.100110011001 * 2^(-3)
S = 0 [since positive]
E = 01111100   [since -3+127 = 124]
M = 10011001100110011001100   [after decimal point]

_IEEE754 binary to decimal_
(-1)^S * 1.M * 2^(E-127)
(-1)^0 * 1.10011001100110011001100 * 2^(-3)
So, the binary number is 0.00110011001100110011001100
So, the decimal number is 0.19999998807907104492

---
## Question 4
For floating point representation, we use 3 registers (31 bits each): 1 for sign[S], 1 for number before decimal point[E], 1 for number after decimal point[M].
For adding two floating point numbers, we use 10 registers: S1, E1, M1, S2, E2, M2, Sr, Er, Mr Same as before, but extra register is to store carry bit C (0 or 1)

Convert given decimal to binary-

If S1 = S2 = 0: 
++Step 1++: Then add M1 and M2 and store result in Mr, we use half adders for this
++Step 2++: If carry = 1, then C = 1 else C = 0
++Step 3++: Now, add E1, E2, C and store result in Er, we use full adders for this
++Step 4++: Finally, Sr = 0 (since both are +ve)
++Step 5++: So final decimal result is (-1)^Sr * (2)^Er has exponent and (2)^Mr will have Mantissa part of result.

If S1 = 0 and S2 = 1 or vice versa:
++Step 1++: We need comparator for this, if E1 > E2 then Sr = 0 (+ve) and convert E2, M2 to 1's complement form using NOT Gate; else Sr = 1 (-ve) and convert E1, M1 to 1's complement form using NOT Gate; if E1 = E2 then check M1 and M2 and do the same.
++Step 2++: Perform steps 1, 2, 3 from before
++Step 3++: So final decimal result is (-1)^Sr * (2)^Er has exponent and (2)^Mr will have Mantissa part of result.

If S1 = S2 = 1:
++Step 1++: Perform Steps 1,2,3 from before
++Step 2++: Finally Sr = 1 (since both -ve)
++Step 3++: So final decimal result is (-1)^Sr * (2)^Er has exponent and (2)^Mr will have Mantissa part of result.

## Question 5
**Code**
```assembly=
.data
    i1_exp:  .word 5
    i1_mant: .word 391
    i1_sign: .word 0

    i2_exp:  .word 3
    i2_mant: .word 102
    i2_sign: .word 0

    r_exp:  .word 10000000
    r_mant: .word 10000004
    r_sign: .word 10000008

.text
main:
    la t0, i1_exp  # Load addresses
    la t1, i1_mant 
    la t2, i1_sign

    la t3, i2_exp
    la t4, i2_mant
    la t5, i2_sign

    li t6, r_exp
    li t7, r_mant
    li t8, r_sign

    lw a0, 0(t0)   # Load values, exp1
    lw a1, 0(t1)   # mant1
    lw a2, 0(t2)   # sign1
    lw a3, 0(t3)
    lw a4, 0(t4) 
    lw a5, 0(t5)

    add a6, a0, a3   # Add exponents

    bgez a0, exp1_positive # Check if exponent of first input is positive
    slli a1, a1, 1  # Shift mantissa of first input left by 1
    addi a0, a0, 1 # Increment exponent of first input
    j exp2_positive # Jump to check if exponent of second input is positive

exp1_positive:
    beqz a3, exp2_positive # Check if exponent of second input is positive
    slli a4, a4, 1  # Shift mantissa of second input left by 1
    addi a3, a3, 1 # Increment exponent of second input
exp2_positive:
    beqz a0, store_r # If exponent of first input is zero, skip normalization
    beqz a3, store_r # If exponent of second input is zero, skip normalization
    blt a0, a3, n_mant1 # If exponent of first input is less than exponent of second input, normalize mantissa of first input
    blt a3, a0, n_mant2 # If exponent of second input is less than exponent of first input, normalize mantissa of second input
    j store_r

n_mant1:
    sub a6, a0, a3 # Calculate difference in exponents
    sll a4, a4, a6 # Shift mantissa of second input left by difference in exponents
    addi a3, a3, a6 # Increment exponent of second input
    j store_r
n_mant2:
    sub a6, a3, a0 # Calculate difference in exponents
    sll a1, a1, a6 # Shift mantissa of first input left by difference in exponents
    addi a0, a0, a6 # Increment exponent of first input
    j store_r

store_r:
    sw a6, 0(t6)
    sw a1, 0(t7) 
    sw a2, 0(t8)
li a7, 10         
ecall              
```
**Output**
t6 register has Exponent of result, that is, 10000010 [130]
t7 register has Mantissa of result, that is, 00001101101101101101101
t8 register has Sign of result, that is, 0

---
