What API? Also, I recommend using a 16bit unsigned texture type to avoid unwanted type conversions when reading the textures.
The basic idea is to multiply the floating point values by 255 then shift and "or" the two values into a single 16 bit value. That value would go into alpha channel. ie
uint16_t packed = static_cast<uint16_t>(low*255.0f) | (static_cast<uint16_t>(high*255.0f)<<8); Inside the shader read the value back using a type that will not reinterpret the bits such as an unsigned sampler. Extract the two values as 8 bit values, convert them to floats and divide by 255 to get back to a value between 0 and 1.
HLSL has a 16 bit half type you might be able use, but GLSL doesn't have universal support for 16 bit float types so it is generally better to store them in 16 bit integer texture types. The other channels can be handled in a similar way.
Basically you want the raw value read from the alpha channel so that the bits are exactly what you put in the texture. Reading a float 16 into a float 32 will go through a conversion that will reinterpret the bits.