Theoretical max RPM tachometer

num blades is a float because I want rpm not to be rounded like when dividing by an integer. This way I don't have to do any convert it.
What's the difference with using a volatile (sorry if it's a dumb question)?

In the ISR I count the number of times something passes infront if the sensor, and records the time from the first pass to the most recent pass.
When I measure the RPM of a propeller spinning at rather high RPMs I generally reach 20-30 passes before the loop() has had time to process it.
Since loop() calculates the RPM by "passes / time" and time is always the timespan from pass one to the most recent I don't see this as a problem at all.

Thank you for your input to improve my code, but it is working I was just wondering to which RPM I can expect it to continue working.