1) Yes, it is as you guessed it, to allow the programmer to use the returnvalue if he or she wants to instead of setting a global flag.
2) I do that to have smaller values on speeds and suck. If I didnt multiply with 50.0f all values (read all speed-values) would have to be 50 times bigger than what they are now. This can by the way be any number of your choice, so it is not required for the function to work.
3) Because that is how you get the time elapsed betwean 2 QueryPerformanceCounter calls, you have to divide them with the frequency.