추가로, 모든 성분이 -1에서 1 사이 값이므로 고정소수점으로 표시하면 압축 효율을 더 높일 수 있다. 단 약간의 정밀도 손실이 수반되기는 한다. 대개 16비트의 정밀도면 납득할 만한 수준인데, -1에서 1 사이 값을 65535가지의 값으로 표현한다. 이로써 원래 네 성분으로 구성되어 128비트를 차지하는 사원수 하나를, 정밀도를 크게 훼손하지 않고도 단 49비트 만으로 직렬화할 수 있다.
void OutputMemoryBitStream::Write(const Quaternion& inQuat) { float precision = (2.f / 65535.f); Write(ConvertToFixed(inQuat.mX, -1.f, precision), 16); Write(ConvertToFixed(inQuat.mY, -1.f, precision), 16); Write(ConvertToFixed(inQuat.mZ, -1.f, precision), 16); Write(inQuat.mW < 0); } void InputMemoryBitStream::Read(Quaternion& outQuat) { float precision = (2.f / 65535.f); uint32_t f = 0; Read(f, 16); outQuat.mX = ConvertFromFixed(f, -1.f, precision); Read(f, 16); outQuat.mY = ConvertFromFixed(f, -1.f, precision); Read(f, 16); outQuat.mZ = ConvertFromFixed(f, -1.f, precision); outQuat.mW = sqrtf(1.f - (outQuat.mX * outQuat.mX + outQuat.mY * outQuat.mY + outQuat.mZ * outQuat.mZ)); bool isNegative; Read(isNegative); if (isNegative) outQuat.mW *= -1; }