2014-07-14 8 views
2

부동 소수점 숫자의 특성과 일부 부동 소수점 연산에서 정밀도가 반드시 손실되어야하는 이유를 설명하는 멋진 문서가 있습니다. 예 : http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlPerl : 어떤 부동 소수점 연산이 무손실입니까?

기본 숫자의 정밀도 측면에서 어떤 부동 소수점 연산이 무손실인지 이해하는 데 관심이 있습니다. 예를 들어,

$x = 2.0/3.0; # this is an operation which will lose some precision 

하지만 정밀도가 떨어질까요?

$x = 473.25/1000000; 

또는 this?

정밀도가 손실 될 때와 유지 될 때를 알기 위해 일반적으로 어 느 정도 규칙을 사용할 수 있습니까?

답변

4

일반적으로 대부분의 연산은 정밀도 손실을 초래합니다. 예외는 부동 소수점으로 정확하게 표현할 수있는 값입니다 (가수가 반복되지 않는 2 진수로 표현 가능함). 산술을 적용 할 때 정밀도 손실없이 표현할 수 있어야합니다.

정밀도 손실이없는 임의의 예제를 구성 할 수 있지만 그러한 예제의 수는 도메인에 비해 적습니다. 예를 들어 두 AB 인 일부 상한보다 더 작은 (@ysth 지적한 바와 같이) B는 2의 거듭 제곱이고, 여기서 A/B

1.0f/8.0f = 0.125f 

바꾸어 말하면, 가수가 표현할 수 있어야 표현의 가수 (mantissa)에 사용할 수있는 총 비트 수에 의해 결정됩니다.

3

귀하의 질문에 큰 가정이 있습니다.

특정 작업이 손실 없는지 여부는 부동 소수점에 숫자를 저장하는 것이 손실없이 수행되는지 여부와 관련이 있습니다. 예를 들어, 귀하의 예제에서이 번호를 가지고 :

$x = .3429; 
sprintf "%.20f", $x; 

출력을 :

0.34289999999999998000 

그래서 일부 작업은 특정 경우에 손실이있을 수 있습니다, 귀하의 질문에 대답 할 수 있습니다. 그러나 원래 숫자와 결과에 따라 달라 지므로 절대로 계산해서는 안됩니다.

자세한 내용은 perlnumber을 참조하십시오.

+1

감사합니다. 유용한 답변이었습니다. –

3

유용한 경험 법칙을 찾을 수있을 것 같지 않습니다.

  • 각 피연산자는 (수학) 결과가 소수점
부동의 정확한 표현을이 지점을
  • 부동의 정확한 표현이 있습니다 모두 다음에 해당하는 경우 일반적으로 정밀도는 손실되지 않습니다

    두 번째 예인 473.25/1000000에서 각 피연산자는 정확한 부동 소수점 표현을 갖지만 몫은 표현하지 않습니다.(분모에 5의 인자를 갖는 임의의 유리수는 밑이 2로 반복적으로 확장되므로 부동 소수점으로 정확하게 표현되지 않습니다.) 위의 규칙은 결과가 앞으로 나오는지 미리 알 수 없기 때문에 특히 유용하지 않습니다. 단지 피연산자를 보면 정확합니다. 당신은 또한 결과를 알 필요가있다.

  • +0

    통찰력있는 의견. 나는 세 가지 대답을 모두 받아 들일 수 있었으면 좋겠다. –