Perform Binary-Point Scaling

This example shows how to perform binary point scaling in FI.

FI Construction

a = fi(v,s,w,f) returns a fi with value v, signedness s, word length w, and fraction length f.

If s is true (signed) the leading or most significant bit (MSB) in the resulting fi is always the sign bit.

Fraction length f is the scaling 2^(-f).

For example, create a signed 8-bit long fi with a value of 0.5 and a scaling of 2^(-7):

a = fi(0.5,true,8,7)
a = 

    0.5000

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 8
        FractionLength: 7

Fraction Length and the Position of the Binary Point

The fraction length or the scaling determines the position of the binary point in the fi object.

The Fraction Length is Positive and Less than the Word Length

When the fraction length f is positive and less than the word length, the binary point lies f places to the left of the least significant bit (LSB) and within the word.

For example, in a signed 3-bit fi with fraction length of 1 and value -0.5, the binary point lies 1 place to the left of the LSB. In this case each bit is set to 1 and the binary equivalent of the fi with its binary point is 11.1 .

The real world value of -0.5 is obtained by multiplying each bit by its scaling factor, starting with the LSB and working up to the signed MSB.

(1*2^-1) + (1*2^0) +(-1*2^1) = -0.5

storedInteger(a) returns the stored signed, unscaled integer value -1.

(1*2^0) + (1*2^1) +(-1*2^2) = -1

a = fi(-0.5,true,3,1)
bin(a)
storedInteger(a)
a = 

   -0.5000

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 3
        FractionLength: 1

ans =

    '111'


ans =

  int8

   -1

The Fraction Length is Positive and Greater than the Word Length

When the fraction length f is positive and greater than the word length, the binary point lies f places to the left of the LSB and outside the word.

For example the binary equivalent of a signed 3-bit word with fraction length of 4 and value of -0.0625 is ._111 Here _ in the ._111 denotes an unused bit that is not a part of the 3-bit word. The first 1 after the _ is the MSB or the sign bit.

The real world value of -0.0625 is computed as follows (LSB to MSB).

(1*2^-4) + (1*2^-3) + (-1*2^-2) = -0.0625

bin(b) will return 111 at the MATLAB® prompt and storedInteger(b) = -1

b = fi(-0.0625,true,3,4)
bin(b)
storedInteger(b)
b = 

   -0.0625

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 3
        FractionLength: 4

ans =

    '111'


ans =

  int8

   -1

The Fraction Length is a Negative Integer and Less than the Word Length

When the fraction length f is negative the binary point lies f places to the right of LSB and is outside the physical word.

For instance in c = fi(-4,true,3,-2) the binary point lies 2 places to the right of the LSB 111__.. Here the two right most spaces are unused bits that are not part of the 3-bit word. The right most 1 is the LSB and the leading 1 is the sign bit.

The real world value of -4 is obtained by multiplying each bit by its scaling factor 2^(-f), i.e. 2(-(-2)) = 2^(2) for the LSB, and then adding the products together.

(1*2^2) + (1*2^3) +(-1*2^4) = -4

bin(c) and storedInteger(c) will still give 111 and -1 as in the previous two examples.

c = fi(-4,true,3,-2)
bin(c)
storedInteger(c)
c = 

    -4

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 3
        FractionLength: -2

ans =

    '111'


ans =

  int8

   -1

The Fraction Length is Set Automatically to the Best Precision Possible and is Negative

In this example we create a signed 3-bit fi where the fraction length is set automatically depending on the value that the fi is supposed to contain. The resulting fi has a value of 6, with a wordlength of 3 bits and a fraction length of -1. Here the binary point is 1 place to the right of the LSB: 011_.. The _ is again an unused bit and the first 1 before the _ is the LSB. The leading 1 is the sign bit.

The real world value (6) is obtained as follows:

(1*2^1) + (1*2^2) + (-0*2^3) = 6

bin(d) and storedInteger(d) will give 011 and 3 respectively.

d = fi(5,true,3)
bin(d)
storedInteger(d)
d = 

     6

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 3
        FractionLength: -1

ans =

    '011'


ans =

  int8

   3

Interactive FI Binary Point Scaling Example

This is an interactive example that allows the user to change the fraction length of a 3-bit fixed-point number by moving the binary point using a slider. The fraction length can be varied from -3 to 5 and the user can change the value of the 3 bits to '0' or '1' for either signed or unsigned numbers.

The "Scaling factors" above the 3 bits display the scaling or weight that each bit is given for the specified signedness and fraction length. The fi code, the double precision real-world value and the fixed-point attributes are also displayed.

Type fibinscaling at the MATLAB prompt to run this example.

%#ok<*NOPTS,*NASGU>