# 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> ```