JavaRush /Java Blog /Random-KO /부동 소수점 숫자 안에는 무엇이 있고 어떻게 작동하나요?
Ivan
레벨 2
Харьков

부동 소수점 숫자 안에는 무엇이 있고 어떻게 작동하나요?

Random-KO 그룹에 게시되었습니다

콘텐츠:

이미지 : http://pikabu.ru/

소개

Java를 배운 첫날에 저는 부동 소수점 숫자와 같은 호기심 많은 유형의 기본 요소를 발견했습니다. 나는 즉시 그 기능에 관심을 갖게 되었고, (상호 연결된) 바이너리 코드로 작성된 방식에 더욱 관심이 생겼습니다. 모든 범위의 정수와 달리 매우 작은 범위(예: 1에서 2까지)에서도 정수의 수는 무한합니다. 그리고 메모리 크기가 유한하기 때문에 이 집합을 표현하는 것은 불가능합니다. 그렇다면 이진수로 어떻게 표현되며 어떻게 작동합니까? 아아, 위키 의 설명 과 여기 Habré에 대한 다소 멋진 기사는 기초를 마련했지만 완전히 이해하지 못했습니다. 이 분석글을 읽은 다음날 아침 에야 깨달음이 왔습니다 .

역사 속으로의 여행

( Habré 기사 에서 발췌 ) 컴퓨터가 크고 프로그램이 작았던 60~70년대에는 부동 소수점 수 자체를 표현하는 표준뿐만 아니라 계산에 대한 단일 표준도 아직 없었습니다. 각 컴퓨터는 다르게 수행했으며 각각 고유한 오류가 있었습니다. 그러나 70년대 중반에 인텔은 "향상된" 연산을 지원하는 새로운 프로세서를 만들고 동시에 이를 표준화하기로 결정했습니다. 이를 개발하기 위해 William Kahan 교수와 John Palmer(아니, 맥주에 관한 책의 저자는 아님) 교수가 참여했습니다. 약간의 드라마가 있었지만 새로운 표준이 개발되었습니다. 이제 이 표준을 IEEE754라고 합니다.

부동 소수점 숫자 형식

학교 교과서에서도 모든 사람은 1.2 × 10 3 또는 1.2 E3 형식 (1.2 × 1000 = 1200 ) 과 같은 매우 크거나 매우 작은 숫자를 쓰는 특이한 방법에 직면했습니다 . 이를 지수 표기법이라고 합니다. 이 경우 N=M×n p 공식을 사용하여 숫자 표현을 다루고 있습니다 .
  • N = 1200 - 결과 숫자
  • M = 1,2 - 가수 - 순서를 고려하지 않은 분수 부분
  • n = 10이 순서의 기본입니다. 이 경우 컴퓨터에 대해 이야기하지 않을 때 기본은 숫자 10입니다.
  • p = 3 - 밑면의 정도
종종 순서의 밑은 10 으로 가정 하고 가수와 밑의 값만 문자 E 로 구분하여 기록합니다. 이 예에서는 1.2 × 10 31.2 E3 에 해당하는 항목을 제공 했습니다. 모든 것이 명확하고 학교 커리큘럼에 대한 향수 어린 여행을 마쳤다면 이제 이것을 잊는 것이 좋습니다. 10이 아닌 2의 거듭제곱, 즉 n = 2 이면 전체 조화 공식 1.2E3이 무너지고 정말 내 머리가 아팠습니다.

부호와 학위

그럼 우리는 무엇을 가지고 있습니까? 결과적으로 우리는 가수 ( 우리가 거듭제곱할 부분과 거듭제곱 자체)로 구성된 이진수도 갖게 됩니다. 또한 정수 유형에서 흔히 볼 수 있듯이 부동 소수점 숫자에는 부호(숫자가 양수인지 음수인지)를 결정하는 비트가 있습니다. float예를 들어, 32비트로 구성된 유형을 고려해볼 것을 제안합니다 . 배정밀도 숫자의 경우 double논리는 동일하며 비트 수가 두 배만 있습니다. 32비트 중 첫 번째 최상위 비트는 부호에 할당되고 다음 8비트는 지수(가수를 올릴 거듭제곱)에 할당되고 나머지 23비트는 가수에 할당됩니다. 설명하기 위해 예를 살펴보겠습니다. 부동 소수점 숫자 내부의 내용과 작동 방식 - 1첫 번째 비트는 매우 간단합니다. 첫 번째 비트의 값이 0 이면 우리가 얻는 숫자는 양수 입니다 . 비트가 1 이면 숫자는 음수가 됩니다 . 8비트의 다음 블록은 지수 블록이다. 지수는 일반적인 8비트 숫자로 작성되며 필요한 차수를 얻으려면 결과 숫자에서 127을 빼야 합니다 . 이 경우 지수의 8비트는 10000001 입니다 . 이는 숫자 129 에 해당합니다 . 이를 계산하는 방법에 대한 질문이 있는 경우 그림에 빠른 답변이 나와 있습니다. 확장된 버전은 모든 부울 대수학 과정에서 얻을 수 있습니다. 부동 소수점 숫자 내부의 내용과 작동 방식 - 21×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 이 8비트에서 얻을 수 있는 최대 수는 11111111 2 = 255 10 이라고 계산하는 것은 어렵지 않습니다. (아래 첨자 210 은 이진수와 십진수 체계를 의미합니다.) 그러나 양의 지수 값만 사용한다면 ( 0 ~ 255 ), 결과 숫자는 소수점 이전에 많은 숫자를 가지지만 이후에는 그렇지 않습니까? 음수 값을 얻으려면 생성된 지수에서 127을 빼야 합니다 . 따라서 각도 범위는 -127 ~ 128 입니다 . 우리의 예를 사용하면 필요한 차수는 129-127 = 2 입니다 . 지금은 이 숫자를 기억해 두자.

가수

이제 가수에 대해. 23비트로 구성되지만 처음에는 항상 비트가 할당되지 않은 또 다른 단위가 암시됩니다. 이는 편의성과 경제성을 이유로 수행됩니다. 소수점 앞이나 뒤의 가수에 0을 추가하면 동일한 숫자를 다른 거듭제곱으로 표현할 수 있습니다. 이를 이해하는 가장 쉬운 방법은 소수 지수를 사용하는 것입니다: 120,000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8 등. 하지만 가수머리에 고정된 숫자를 입력하면 매번 새로운 숫자를 받게 됩니다. 23비트 이전에 하나와 함께 하나가 더 있을 것이라는 것을 당연하게 생각합시다. 일반적으로 이 비트는 점으로 나머지 비트와 구분되지만 이는 아무 의미도 없습니다. 1. 그게 더 편해요. 111000000000000000000000 부동소수점 숫자의 내부 내용과 작동 방식 - 3이제 결과 가수를 왼쪽에서 오른쪽으로 거듭제곱하여 각 단계마다 거듭제곱을 줄여야 합니다. 계산 결과 얻은 거듭제곱의 값, 즉 2 부터 시작 합니다(2의 거듭제곱의 각 값을 쓰지 않기 위해 의도적으로 간단한 예를 선택했으며, 해당 비트는 0임) 부동 소수점 숫자 안에 무엇이 있고 어떻게 작동합니까? - 41×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0.5 = 4+2+1+0.5 = 7.5 결과 7.5 를 얻었습니다. 예를 들어 이 링크 에서 정확성을 확인할 수 있습니다.

결과

표준 부동 소수점 숫자는 float32비트로 구성됩니다. 첫 번째 비트는 부호(+ 또는 -)이고, 다음 8개는 지수, 다음 23개는 가수입니다. 부호에 따라 - 비트 0이 양수인 경우. 비트 1이 음수인 경우. 지수법으로 비트 단위를 10진수로 변환합니다(왼쪽에서 첫 번째 비트는 128 , 두 번째 비트는 64 , 세 번째 비트는 32 , 네 번째 비트는 16 , 다섯 번째 비트는 8 , 여섯 번째 비트는 4 , 일곱 번째 비트는 2 , 여덟 번째는 1 ) 결과 숫자에서 127을 빼면 시작할 정도를 얻습니다. 가수에 따르면 앞에 있는 기존 23비트에 값 1을 갖는 또 다른 비트를 추가하고 그로부터 우리가 받은 전력을 높이기 시작하여 각 후속 비트에서 이 전력을 감소시킵니다. 그게 다야, 얘들아! 부동소수점 숫자의 내용과 작동 방식 - 5추신: 숙제로 이 기사를 사용하여 부동 소수점 숫자를 사용한 다수의 산술 연산에서 정밀도 오류가 발생하는 이유에 대한 버전을 댓글에 남겨주세요.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION