voltage = 442368 * 657 = 0x1152 C000 (Q1.31 format);

Imho you can't do math with Q-formatted numbers this way unless you use a library that does the necessary conversions for you.

- what is the resolution of the ADC? Presumably 12 bit, but you don't state that explicitly. I assume this from your using the factor 2
^{12}.
- what is the reference voltage for the ADC, i.e. what is the correspondence between ADC value and voltage?
- are you using signed or unsigned values, i.e. can teh voltage be only of one poöarity or can it be of both polarities?
- there seem to be different versions of the Q-notation. Which one do you use?
- why do you use the Q-notation at all? Seems overkill to me.

Assuming you have

- 12 bit ADC (0...4095)

- unipolar input voltage

- 5 V reference voltage, i.e. ADC 4095 == 5 V

Then

V

_{in} = 5 V / 4095 × 13.5 × ADC_value= 0.0165 × ADC_Value

Simply do integer math by scaling the constant factor up and re-scaling down after the multiplication:

V

_{in} = 0.0165 × ADC_Value = (10000 × 0.0165 × ADC_Value) / 10000 = (165 × ADC_Value) / 10000

(the exact value of the factor is more like 0.016479...)

This requires 32 bit integer math, but this is going to be faster than any kind of floating point emulation.

With some loss of accuracy and not fully using the range of the ADC you could get away with 16 bit math:

V

_{in} = 0.0165 × ADC_Value = (1000 × 0.0165 × ADC_Value) / 1000 = (16 × ADC_Value) / 1000

If, on the other hand, you had a floating point unit (which I assume you don't have), there would be no need for any other number format than the native flaoting point format of this unit.