0

IEEE-754 Float 시각화 도구

십진수가 IEEE-754 float으로 저장되는 방식을 부호 비트, 지수 비트, 가수 비트로 나누어 정확히 보여주며, 0.1 같은 수가 왜 정확히 저장되지 않는지 설명합니다.

🔒 전적으로 귀하의 브라우저에서 처리됩니다. 여기에 입력하는 어떤 것도 업로드되지 않습니다.

처리 중... 0%
정규화 중
지수 바이어스 계산 중
가수 비트 확장 중
완료

결과

컴퓨터가 저장하는 모든 부동소수점 수—JavaScript number, C float, Python float—는 IEEE 754 아래에서 동일한 방식으로 인코딩됩니다. 부호 비트 하나, 지수 비트 블록 하나, 가수(소수부) 비트 블록 하나로 구성됩니다. 32비트 단정밀도는 부호 1비트, 지수 8비트, 가수 23비트를 사용하며, 64비트 배정밀도는 대부분의 언어 기본 숫자 타입의 기반 포맷으로서 부호 1비트, 지수 11비트, 가수 52비트를 사용합니다. 이 도구는 입력한 십진수를 브라우저의 DataView/ArrayBuffer float 인코더(실제 코드가 동작하는 것과 동일한 방식)로 선택한 비트 폭으로 인코딩하고, 각 비트가 속한 영역을 색상으로 구분합니다.

인코딩 자체는 세 단계를 거치며, 이 도구는 최종 비트만 보여주는 대신 모든 과정을 안내합니다. 먼저 정규화입니다. 수를 1.가수 × 2^지수 꼴로 다시 쓰되, 소수점 위에 0이 아닌 숫자가 하나만 오도록 합니다(너무 작아서 이 범위에 들지 못하는 수는 비정규수로 처리하며, 암시적인 선두 1이 없습니다). 둘째, 지수 바이어스입니다. 지수 필드는 양의 지수와 음의 지수를 모두 부호 없는 정수로 저장해야 하므로, 싱글 정밀도에서는 127, 더블 정밀도에서는 1023의 고정 바이어스 값을 더한 후 2진수로 기록합니다. 셋째, 소수부 가수를 “2를 곱한 뒤 정수 부분을 다음 비트로 취하고 나머지를 유지하는” 고전적 방법으로 비트 단위로 확장하며, 가수 필드가 가득 찰 때까지 반복한 후 남은 비트로 올림 또는 내림 여부를 결정합니다(IEEE-754 기본값인 짝수 반올림).

바로 이 때문에 0.1처럼 평범한 수도 정확히 저장되지 않습니다. 2진법에서 0.1은 0.0001100110011…로 무한 반복되는 소수이므로, 유한한 가수로는 결코 정밀하게 표현할 수 없으며 어느 지점에서 반올림될 수밖에 없습니다. 0.1을 32비트 float으로 인코딩하고 그 비트를 다시 읽으면 0.1이 아니라 정확히 0.100000001490116119384765625를 얻습니다. 배정밀도는 가수 비트가 29비트 더 많아 반올림 오차가 훨씬 작지만, 그래도 0은 아닙니다. 64비트 double로서의 0.1은 정확히 0.1000000000000000055511151231257827021181583404541015625입니다. 이 도구는 큰 정수 연산으로 (부동소수점 우회 없이) 그 정확한 저장 값을 계산하기 때문에, 입력한 값과 하드웨어가 실제로 유지하는 값 사이의 차이가 결코 숨겨지거나 근사되지 않습니다.

특수 값은 일반 인코딩이 아닌 예약된 정확한 비트 패턴을 갖습니다. 0과 음의 0은 지수와 가수 비트가 모두 0입니다(부호 비트만 다름). ±Infinity는 지수 비트가 모두 1이고 가수는 모두 0이며, NaN은 지수 비트가 모두 1이고 가수 비트가 하나 이상 1입니다. 모든 작업은 브라우저 안에서 로컬로 실행되며 입력한 내용은 어디에도 업로드되지 않으므로, 부동소수점 버그에 대한 진정한 직관을 안전하게 쌓을 수 있습니다. 왜 거의 모든 프로그래밍 언어에서 `0.1 + 0.2 !== 0.3`인지, 그래픽스 코드의 float32 텍스처가 왜 float64라면 잃지 않을 정밀도를 잃는지, 금융 코드는 왜 일반적으로 이진 부동소수점을 피해야 하는지 말입니다.