This is because of different precision standards used for float and double. Float uses Single Precision and Double uses Double Precision.
https://www.geeksforgeeks.org/difference-float-double-c-cpp/
https://stackoverflow.com/questions/5098558/float-vs-double-precision
Now, 1.1 in binary is 1.00011001100 (approx.). In float the last digits(after radix point) are modified to store it as a float where as in double more "original" digits are saved. This modification actually makes 1.1 stored in float greater than 1.1 stored in double.
Similarly, 1.01 in binary is 1.00000010100 (approx.). Float's most significant digits after radix point(000000) makes it smaller than double after storing with modification.
It is easier to understand by adding the below line at the end of your program and see output for Case 2 and 3.
printf("\n%.18f %.18lf",a,b);