2012-06-06 3 views
1

부동 소수점 구현에 관한 IEEE 표준을 읽으려고했지만 꽤 발전했으며 생계 유지 프로그램이 아닙니다.부동 소수점 숫자를 사용할 때 범위를 제한하면 정밀도가 떨어 집니까?

이것은 내가 궁금해 한 것입니다.

0에서 N 사이의 float 변수가 있다고 가정하고 필요한 경우 크기를 조정하지만이 중간 표준화되지 않은 값으로 중간 계산이 수행됩니다.

논리적으로는 [0.0, 1.0]이면 충분합니다. 그러나 0에서 1 사이의 수를 제한하면 어떤 식 으로든 정밀도가 떨어 집니까? [0, 10.0] 또는 [0, 1000000.0]을 사용하면 아무 것도 얻을 수 있습니까?

감사합니다.

+0

값을 "제한"하는 방법을 어떻게 제안합니까? –

+0

IEEE 부동 소수점 숫자는 이미 내부적으로이 원칙에 따라 작동합니다. 가수는 1.0b에서 1.11.1.1b 사이이며 "척도"(말하자면)를 처리 할 지수가 있습니다. – user7116

답변

2

당신의 아이디어는 좋은 것이지만 어떤 의미에서는 부동 소수점 숫자가 이것을 위해 설계 되었기 때문에 아무것도 저장하지 않습니다.

내부적으로 float에는 가수와 지수라는 두 부분이 있습니다. 가수는 범위와 같고 지수는 "실제"값으로 가져 오는 데 필요한 크기 조정입니다.

당신이주는 어떤 숫자도 [1-9.999 ...]와 10 승수의 범위로 정규화됩니다. 따라서 거의 모든 값에 대해 가수의 정밀도를 얻을 수 있습니다 (단 예외는 지수의 극단에 도달 할 때 - 즉 "비정규 숫자"(또는 "비정규")라고 불림)하지만 극도로 작습니다 (0에 가깝습니다) 또는 큰, 그리고 당신이 걱정할 필요가없는 것, 보통).

1.23 또는 12.3 또는 123을 입력했는지 여부에 관계없이 1.23 (가수)에 인수 (1, 10 또는 100, 지수)를 내부적으로 저장합니다.

실제로 이것은 10 진수 (십진수) 대신 2 (2 진수)의 제곱을 사용하기 때문에 사실이 아닙니다 (sixlettervariable의 주석 참조). 일반적인 아이디어입니다.

+0

가수는 단 정밀도 정규화 된 숫자의 경우 1.0b에서 1.1111111111111111111111111b (~ 1.9999998) 사이이며 단 정밀도 비정규 화 된 숫자의 경우 0.00000000000000000000001b 및 0.11111111111111111111111b입니다. – user7116

+0

옙과 나는 소수점 가수 범위를 고쳤다. 그것은 틀렸다. 이진수 1.111111 ...은 9.99999와 같은 아이디어입니다. 다음 배율 인수 (2는 2, 10은 10)에 가깝습니다. –

+0

흥미롭게도 IEEE 부동 소수점은 행간을 저장하지 않습니다. 1이면 지수가 0이고 가수가 0이 아니면 가정합니다. 따라서 비정규 값. – user7116

관련 문제