You're indexing into the table using multiples of 0.05 Mach, but that only works if each row is separated by 0.05 Mach, which isn't the case.
It can be fixed by making a more generic LUT that doesn't depend on the step size between rows.
Store an array of inputs and an array of outputs.
Inputs would be the G1 table's Mach numbers
Outputs would be the G1 table's drag coefficients.
Binary search through the inputs to find the floored index.
This gets you the index of the largest input from the table that's still smaller than the search value.
The search value would be the bullet's current Mach number in this case.
Get ceilinged index.
If you make your first binary search go from 0 to maxIndex - 1, then you can simply add 1 to the floored index to get a ceilinged index and it will always safely stay in bounds.
Then you'll have your lower and upper indices and can lerp using the input and output at these indices.
There's a bug/error in the calculation of the G1 coefficient.
You're indexing into the table using multiples of 0.05 Mach, but that only works if each row is separated by 0.05 Mach, which isn't the case.
It can be fixed by making a more generic LUT that doesn't depend on the step size between rows.