고정소수점 Q 포맷 변환기
Q15·Q16.16 같은 표기에서 실수와 raw 정수를 서로 바꿉니다. 표현 범위와 분해능을 함께 내고, 범위를 넘어 조용히 감기거나 분해능보다 작아 사라지는 경우를 짚어 줍니다.
Q0.15에 담긴 값
0.75
raw 24576 · 0x6000 · 오차 없음
사용 방법
- 1자주 쓰는 포맷을 고르거나 Q15·Q16.16처럼 직접 적습니다.
- 2담고 싶은 실수를 넣으면 raw 정수와 실제로 담기는 값이 나옵니다.
- 3표현 범위와 분해능을 먼저 확인하세요. 값이 그 사이에 있어야 합니다.
- 4넘침이나 소실 경고가 뜨면 소수부 비트나 스케일을 다시 잡아야 합니다.
자주 묻는 질문
Qm.f에서 m이 정수부 비트, f가 소수부 비트입니다. Q15처럼 하나만 적으면 정수부가 없다는 뜻이라 Q0.15와 같습니다. 실수를 담을 때는 raw = round(값 × 2^f)로 정수를 만들고, 읽을 때는 raw / 2^f로 되돌립니다. 소수점 위치를 약속으로만 정해 두고 실제로는 정수 연산만 하는 방식입니다.
−1.0으로 뒤집힙니다. 부호 있는 Qm.f의 범위는 −2^m 이상 2^m − 2^(−f) 이하라 위쪽 끝이 한 칸 모자라기 때문입니다. Q15의 최대는 0.999969482421875이고, 1.0의 raw인 32768은 16비트 2의 보수에서 −32768이 되어 값이 −1.0이 됩니다. 오차가 커지는 것이 아니라 부호가 반대인 최대값이 되는 것이라, 제어 루프에서는 출력이 반대 방향으로 튑니다.
담을 수 있는 가장 작은 간격으로 2^(−f)입니다. Q15면 2⁻¹⁵ = 0.0000305이고, 그 절반보다 작은 값은 반올림하면 0이 되어 아무 경고 없이 사라집니다. 적분기처럼 작은 값을 계속 더하는 구조에서 이것이 쌓이면 값이 영원히 올라가지 않는 버그가 됩니다. 저장 오차는 항상 분해능의 절반을 넘지 않습니다.
시프트를 빼먹었기 때문일 가능성이 큽니다. Qm.f 둘을 곱한 raw는 소수부가 2f비트인 값이 되므로, 다시 원래 포맷으로 쓰려면 f비트 오른쪽으로 밀어야 합니다. Q15끼리 곱했는데 안 밀면 결과가 32768배로 나옵니다. 중간 결과도 두 배 폭이 필요해서, Q15 곱셈은 32비트에 받아야 하고 16비트에 그대로 받으면 거기서 또 감깁니다.
감김은 넘친 값이 반대쪽 끝으로 돌아가는 것이고, 포화는 끝값에 붙여 두는 것입니다. 하드웨어가 기본으로 하는 동작은 감김이라 1.0이 −1.0이 되지만, 포화 연산을 쓰면 0.99997에 머뭅니다. 값이 크게 틀리는 것은 마찬가지여도 방향이 유지되므로 실무 DSP 코드는 포화 명령을 씁니다. 이 계산기는 두 결과를 함께 보여 줍니다.
이 계산기에서는 포함하지 않고 따로 셉니다. 자료에 따라 m에 부호를 넣기도 해서 같은 Q7.8이 16비트로도 17비트로도 읽힐 수 있습니다. 여기서는 부호 있는 Q7.8의 전체 폭을 7+8+1 = 16비트로 봅니다. 쓰시는 라이브러리 문서의 표기 규칙을 한 번 확인하고 맞춰 주세요.
전체 64비트라 자바스크립트가 raw 정수를 정확히 만들 수 없기 때문입니다. 자바스크립트 수는 2⁵³까지만 정수를 정확히 담으므로, 그보다 넓은 포맷을 계산하면 낮은 자리가 조용히 어긋난 값이 나옵니다. 틀린 답을 내느니 막는 편이 낫다고 보아 정수부와 소수부의 합을 52비트까지만 받습니다.
알아두면 좋은 점
- 정수부 m은 부호 비트를 제외한 수로 셉니다. 자료에 따라 m에 부호를 포함하는 표기도 있으니 확인이 필요합니다.
- 정수부 + 소수부가 52비트를 넘는 포맷은 자바스크립트에서 정확히 다룰 수 없어 받지 않습니다.
- 반올림은 가장 가까운 정수로 합니다. 절사(truncate)를 쓰는 구현에서는 결과가 한 칸 다를 수 있습니다.
- 실제 하드웨어의 넘침 동작은 감김이 기본이지만, 포화 명령을 쓰는지는 코드와 명령어에 따라 다릅니다.
- 입력한 값은 브라우저 안에서만 계산되며 서버로 전송되지 않습니다.
함께 보면 좋은 도구
마지막 검증: 2026년 8월 31일 · 결과는 참고용 추정치입니다.