rpm = (dpm * 60000000) / 360; // converts degrees per micro to rpm
Don't you have a calculator?
Also, it suddenly dawned upon me, that as shaft speed increases - dpm will of course get larger, and thus more accurate in itself.
Larger values do not translate into more accurate results. The time between pulses will be shorter, so you'll theoretically calculate rpm more often, but no more accurately.
float timer_c_pulsemicros = 0;
float timer_p_pulsemicros = 0;
Times are NOT floats.
You really need to start at line one of your sketch. Look at each and every line, and see if it makes sense.
Storing time in a float doesn't.
if (lastCommand != timer_pulsecount){
pulses are not commands. There is no relationship between these variables that can be inferred from the names. And that means studying the code. No. The real solution is meaningful names.
Also, look at the order of operations in your code. You compute rpm and then possibly update the time variables. That doesn't make sense. The last thing to do is use the pulse count over some period of time to determine rpm.
One last thing. You are copying variables that are larger than byte sized. What happens if, during that copy, an interrupt occurs that changes timer_pulsecount or p_lastpulse?
c_lastpulse = micros();
This, in loop(), is absolutely NOT the last time a pulse occurred. A better name is definitely required.
You only need two times - the last time you reported rpm and now. The value of rpm is then a function of the number of pulses received in that interval and the internal.
If it's been a long time since a pulse occurred, so what? The pulse count in that interval will be 0, so the rpm will be 0.