2015-01-08 14 views
1

두 개의 값이 있다고 가정하면 double입니다. 그들 중 하나는 매우 크고 그 중 하나는 매우 작습니다.java.lang.Double의 정밀도 손실

double x = 99....9; // I don't know the possible max and min values, 
double y = 0,00..1; // so just assume these values are near max and min. 

이러한 값을 함께 추가하면 정밀도가 떨어 집니까?

다른 말로하면 int 값을 할당하면 최대 double 값이 증가합니까? 그리고 작은 정수 부분을 선택하면 최소 double 값이 감소합니까?

double z = x + y; // Real result is something like 999999999999999.00000000000001 
+0

[여기] (http://stackoverflow.com/questions/177506/why-do-i-see-a-double-variable-initialized-to-some-value-like-21-4-as- 21-3999996) – Dima

+2

정밀도가 걱정된다면'double'을 사용하지 말고'BigDecimal'을 사용하십시오. – geert3

+0

@ geert3'BigDecimal'은 나누기가 필요할 때마다 정밀도를 유지할 것을 보장하지 않습니다. –

답변

1

시도를 세 진수와 (대략적으로) 일반적인 이진 부동 소수점 산술과 동일한 기능을 제공합니다. 123.0 및 4.56이 있다고 가정 해보십시오. 이 수는 가수 (0 < = m < 1)와 지수 : 0.123 * 10^3 및 0.456 * 10^1로 표시되며 < .123e3> 및 < .456e1>로 작성됩니다. 이 개 같은 번호를 추가하면 지수가 동일하지 않는 한 즉시 가능하지, 그리고 또한이에 따라 진행하는 이유는 다음과 같습니다

<.123e3> <.123e3> 
<.456e1> <.004e3> 
      -------- 
      <.127e3> 

당신은 볼 공통 지수에 따라 진수의 필요한 정렬의 손실을 생산하고 정도. 극단적 인 경우, 전체 가수가 무의미하게 바뀔 수 있습니다. 용어가 작고 작지만 계산되는 합계에 상당한 기여를하는 무한 계열을 합산하는 것을 생각하십시오.

부정확 한 다른 원인은 이진수와 소수 자릿수의 차이로 인해 발생합니다. 다른 하나를 사용하여 오류없이 표현 될 수 없습니다.

즉, 간단히 말해서 크기가 다른 순서에서 더하거나 뺄셈을하면 정밀도가 떨어집니다.

4

두 값이 모든 숫자에 고르게 분포하지 않습니다. double은 숫자의 부동 소수점 표현을 사용합니다. 즉, 지수에 사용 된 고정 비트 수와 실제 "수"/ 가수를 나타내는 고정 된 비트 수를 가짐을 의미합니다.

따라서 큰 값과 작은 값을 사용하면 더 큰 지수를 사용하여 표현할 수 없으므로 더 작은 값이 떨어집니다.

정밀도를 떨어 뜨리지 않는 솔루션은 고정 된 비트 수에 국한되지 않고 BigDecimal과 같이 잠재적으로 증가하는 정밀도를 갖는 숫자 형식을 사용합니다.

0

너무 큰 값 또는 너무 작은 값을 지정하려고하면 이중, 컴파일러에서 오류 줄 것이다 :

내가 정밀도로 소수점 연산 부동 소수점을 사용하고이

double d1 = 1e-1000; 
    double d2 = 1e+1000;