# Challenge #20

Let’s do challenge #20, because #19 it’s quite tricky will have it as a WIP ðŸ˜…. Challenge #20 can be found on the original website. Here is the assembly code to understand

```
f4:
.LFB40:
sub rsp, 8
call rand
;; convert rand generated number to int
cvtsi2ss xmm0, eax
mulss xmm0, DWORD PTR .LC0[rip]
add rsp, 8
ret
.LC0:
.long 805306368
```

According to the description we are dealing here with floating point numbers. Let’s start the analysis of it.

## Analysis

We first have a call to `rand`

to generate a random number, followed by an instruction `cvtsi2ss`

which convert the generated random number into floating number. Later we compute the `r * 4.656612873077392578125E-10`

, where `r`

is our recently generated rand number. The code in C would be

```
float f(void)
{
return float()rand() * 4.656612873077392578125E-10;
}
```

Yes, you noticed right? I multiplied by `4.656612873077392578125E-10`

instead of `805306368`

, for understanding that you should read Wikipedia IEEE_754 article. Also this online converter will help you, if you supply the hex representation of `805306368`

, which is `0x30000000`

you will get `4.65661287308e-10`

.

Given that rand will give us a random number from [0, RAND_MAX], RAND_MAX in my OS has value `2147483647`

, this operation will give us values from [0, 0.9999999995348987]. One thing missing in this code is the seed of `rand`

function, so it will be always evaluated with seed 1.

**Formal description**

Generate numbers from 0 to 1.