[java] Java에서 float와 double에는 몇 개의 유효 자릿수가 있습니까?

float는 32 개의 이진수를 가지고 있고 double은 64 개의 이진수를 가지고 있습니까? 문서는 이해하기가 너무 어려웠습니다.

모든 비트가 유효 숫자로 변환됩니까? 아니면 소수점 위치가 일부 비트를 차지합니까?



답변

float : 32 비트 (4 바이트) 여기서 가수에 23 비트 가 사용됩니다 (약 10 진수 7 자리). 지수에 8 비트가 사용되므로 부동 소수점은이 8 비트를 사용하여 소수점을 오른쪽이나 왼쪽으로 “이동”할 수 있습니다. 이렇게하면 0.0000003 (3 × 10 -7 ) 또는 3000000 (3 × 10 7 ) 과 같이 가수에 많은 0이 저장되는 것을 방지 할 수 있습니다. 부호 비트로 사용되는 1 비트가 있습니다.

double : 64 비트 (8 바이트) , 가수에 52 비트 가 사용됩니다 (약 16 진수). 지수에는 11 비트가 사용되고 부호 비트는 1 비트가 사용됩니다.

바이너리 (0과 1 만)를 사용하기 때문에 숫자가 0이 아닐 때 가수의 1 비트는 암시 적으로 1 (float 및 double 모두이 트릭 사용)입니다.

또한 모든 것이 이진 (가수 및 지수)이므로 십진수로의 변환은 일반적으로 정확하지 않습니다. 0.5, 0.25, 0.75, 0.125와 같은 숫자는 정확히 저장되지만 0.1은 저장되지 않습니다. 다른 사람들이 말했듯이 센트를 정확하게 저장해야하는 경우 float 또는 double을 사용하지 말고 int, long, BigInteger 또는 BigDecimal을 사용하십시오.

출처 :

http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers

http://en.wikipedia.org/wiki/Binary64

http://en.wikipedia.org/wiki/Binary32


답변

32 비트 부동 소수점은 약 7 자리의 정밀도를 가지며 64 비트 double은 약 16 자리의 정밀도를가집니다.

긴 대답 :

부동 소수점 숫자에는 세 가지 구성 요소가 있습니다.

  1. 숫자가 양수인지 음수인지 확인하기위한 부호 비트.
  2. 숫자 의 크기 를 결정하는 지수 입니다.
  3. 숫자가 두 지수 값 사이의 거리를 결정하는 분수. 이를 “유의, 가수 또는 계수” 라고도합니다.

기본적으로 이것은 sign * 2^exponent * (1 + fraction). 숫자의 “크기”, 지수 는 분수 부분의 값만 조정 하기 때문에 우리와는 무관합니다 . 그것이 , † log₁₀(n)의 자릿수 를 제공 한다는 것을 알면,를 사용하여 n부동 소수점 숫자의 정밀도를 결정할 수 있습니다 log₁₀(largest_possible_fraction). float의 각 비트는 두 가지 가능성을 저장하기 때문에 이진수 n비트는 최대 2ⁿ - 1( 2ⁿ 중 하나가 0 인 의 합계) 까지의 수를 저장할 수 있습니다 . 0은 특별히 표현되고 모든 0이 아닌 숫자는 0이 아닌 이진 비트가 하나 이상 있기 때문에 부동 소수점 숫자는 사용할 수있는 것보다 1 비트 적은 분수로 저장되므로 약간 더 복잡해집니다. ‡

이를 결합하면 부동 소수점 숫자의 정밀도 자릿수는입니다
log₁₀(2ⁿ). 여기서는 n부동 소수점 숫자의 분수 비트 수입니다. 32 비트 부동 소수점은 ≈7.22 소수 자릿수에 대해 24 비트의 분수를 가지며 64 비트 double에는 ≈15.95 소수 자릿수에 대해 53 비트의 분수가 있습니다.

부동 소수점 정확도에 대한 자세한 내용은 기계 엡실론 의 개념에 대해 읽어 볼 수 있습니다 .


n ≥ 1적어도 — 다른 숫자의 경우 수식이 더 비슷해 보입니다
⌊log₁₀(|n|)⌋ + 1.

‡ “이 규칙은 리딩 비트 규칙, 암시 적 비트 규칙 또는 숨겨진 비트 규칙이라고 다양하게 불립니다.” ( 위키 백과 )


답변

에서 자바 사양 :

부동 소수점 유형은 float 및 double이며, 이진 부동 소수점 산술에 대한 IEEE 표준, ANSI / IEEE에 지정된대로 단 정밀도 32 비트 및 배정 밀도 64 비트 형식 IEEE 754 값 및 연산과 개념적으로 연관됩니다. 표준 754-1985 (IEEE, New York).

IEEE754 기본 사항을 이해하지 않고 숫자로 무엇이든하기가 어렵 기 때문에 여기에 또 다른 링크가 있습니다.

정밀도가 균일하지 않고 정수에 대해 수행되는 정확한 숫자 저장이 아님을 이해하는 것이 중요합니다.

예 :

double a = 0.3 - 0.1;
System.out.println(a);

인쇄물

0.19999999999999998

임의 정밀도가 필요한 경우 (예 : 재정적 목적) Big Decimal 이 필요할 수 있습니다 .


답변

일반적인 수학 답입니다.

부동 소수점 숫자가 지수를 나타내는 일부 비트로 구현되고 나머지는 대부분 숫자 (이진 시스템에서)에 대해 구현된다는 것을 이해하면 다음과 같은 상황이 발생합니다.

높은 지수 (예 : 10²³)를 사용하면 최하위 비트가 변경되면 인접한 구별 가능한 두 숫자 사이에 큰 차이가 나타납니다. 또한 소수점 2 진수는 많은 10 진수 숫자를 근사화 할 수 있도록합니다. 1/5, 1/10은 끝없는 숫자입니다.

따라서 일반적으로 유효 숫자에 관심이 있다면 부동 소수점 숫자를 사용해서는 안됩니다. e, a 계산이있는 금액의 경우 BigDecimal을 사용하는 것이 가장 좋습니다 .

대한 물리 부동 소수점 두 배는 적합, 수레하지 거의 절대. 또한 프로세서의 부동 소수점 부분 인 FPU는 내부적으로 좀 더 정밀성을 사용할 수도 있습니다.


답변

부동 소수점 숫자는 지수 형식을 사용하여 인코딩됩니다. m * b ^ e즉, 정수와는 전혀 다릅니다. 당신이 묻는 질문은 고정 소수점 수 의 맥락에서 의미가있을 것 입니다 . 수많은 고정 소수점 산술 라이브러리가 있습니다. 사용할 수 있습니다.

부동 소수점 산술 관련 : 십진 자릿수는 표시 및 숫자 체계에 따라 다릅니다. 예를 들어, 0.3333310 진수로 유한 한 표현이 없지만 2 진수로 1 개가 있고 그 반대의 경우도 있는 주기적 숫자 ( )가 있습니다.

또한 그것은 언급 할만큼 가치는 특정 지점에 소수점 숫자를 부동의 차이보다 더 큰, 즉이 없다는 것입니다 value + 1수율을 value하기 때문에, value + 1사용하여 인코딩 할 수없는 m * b ^ em, b그리고e 길이가 고정되어 있습니다. 1보다 작은 값에 대해서도 마찬가지입니다. 즉, 가능한 모든 코드 포인트의 거리가 동일하지 않습니다.

이로 인해 n고정 소수점 숫자와 같은 정확한 숫자의 정밀도는 없습니다. n십진수가있는 모든 숫자 에 IEEE 인코딩이있는 것은 아니기 때문 입니다.

부동 소수점 수를 설명하는 거의 필수 문서가 있습니다.
모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항 .


답변

Float.intBitsToFloatDouble.longBitsToDouble종류의 비트 부동 소수점 숫자에 해당하는 방법을 설명한다. 특히, 정상적인 float모습 의 비트는

 s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW

여기서 A … W는 23 비트 (0s 및 1s)이며 이진수로 분수를 나타냅니다 .s는 +/- 1이며 각각 0 또는 1로 표시되고 exp는 부호있는 8 비트 정수입니다.


답변