Using interrupts and a hardware timer you can get precision up to 1/16 uSec.

This will give the following table (assuming the distance between sensors is 20cm)

221,0000 905,0

221,0625 904,7

221,1250 904,5

221,1875 904,2

221,2500 904,0

221,3125 903,7

221,3750 903,4

221,4375 903,2

221,5000 902,9

221,5625 902,7

221,6250 902,4

221,6875 902,2

221,7500 901,9

221,8125 901,7

221,8750 901,4

221,9375 901,2

222,0000 900,9

222,0625 900,6

222,1250 900,4

222,1875 900,1

222,2500 899,9

So that is 0.3m on 900m/sec is in the order of 0.5‰. This is very precise in theory but in practice there are a few possible problems.

1) if the distance between the sensors is 0.5% off (20.1 cm iso 20.0 cm) the calculated speed will also be 0.5% off

2) if one sensor reacts slower than the other you will get an additional penalty

3) if the clock of the Arduino is not 16.000.000 Hz but 1‰ off, the calculated speed will also be 1‰ off.

So although in theory you can get an accuracy of 0.5‰, in practice it will be around 1% at best.

Calibrating the numbers used in the math can help to maximize the accuracy.