Assignment, even as part of the initialization acts as an operator. you have a float variable initialized by a double constant. Of course it will be converted to float.
Types used for calculation and the final type don't have to match. "int a = 10 * 0.5;" would result in integer 5 stored in "a", even though the right part is double 5.0.
But I don't see what any of this has to do with anything here.
You have not looked at the embedded code that uses floating point a lot. This is used everywhere where people care about performance. Including on the X86 because floats pack better into vectored operations. All performance-oriented code (like games) use floats for storage of coordinates and stuff like this.
And just as an example, I googled "stm32 dsp github" and clicked on the first link that was not ARM CMSIS package. Here is the code I've got
https://github.com/YetAnotherElectronicsChannel/STM32_DSP_Reverb/blob/master/code/Src/main.c . It uses floats and 'f' suffix everywhere. Honestly the first click on a random search. So, yes, people know about this.
And just for fun, I looked at the ARM DSP library. Again, all 'f's everywhere
https://github.com/ARM-software/CMSIS-DSP/blob/main/Source/FastMathFunctions/arm_atan2_f32.cAnd just to clarify, they are using 'f' even in the initialization of variables. This is not strictly necessary, but it indicates intent. Plus if you work with floating point a lot, typing 'f' at the end of constants becomes automatic thing.