2012-07-16 4 views

답변

6

부동 소수점 숫자는 정밀도를 제한했다. 큰 숫자 (1e20)에 작은 숫자 (3)를 추가하면 큰 숫자와 같은 결과가 나오는 경우가 많습니다. 즉

(3 + 1e20) - 1e20 = 1e20 - 1e20 = 0 

double의 정밀도는 약 15 진수이다 따라서, 현재의 경우, float들 정밀도 7 십진수있다. 이 타임 스탬프에 관련이 있지만

+2

+1; 파이썬에서는 적어도'(3 + int (1e20)) - int (1e20)'을하고'3'을 얻을 수 있습니다. 참조 용으로 –

3

는 기사 “Don't store that in a float” 가장 중요한 포인트를 arithmetics을 떠 사용할 때 얻을 수있는 함정의 대략적인 개요를 제공합니다 :

    :

    이 실제 예는 몇 가지를 보여줍니다

  • 다양한 크기의 부동 소수점을 더하거나 뺄 때마다 정밀도를 잃어 버릴 때까지 기다려야합니다.
  • 'float'대신 'double'을 사용하는 것이 올바른 해결책이지만, 종종 mor 전자 안정적인 알고리즘은 널리 다양한 크기입니다 두 번째 경우는 3 10²⁰을 추가하고,에서

더 중요하다. 제한된 정밀도의 복소수 (약 14 자리, 4 바이트 부동 소수점 (단 정밀도)의 경우 7) 때문에 결과에서 3이 손실됩니다. 그러나 처음에 1020을 빼면 0이되고, 3을 더하면 결과가 전혀 변경되지 않습니다.

이러한 연산 순서의 이러한 약간의 차이는 특정 계산에서 중요해질 수 있으며 IEEE 플랫폼에서 부동 소수점 숫자를 처리 할 때는 항상 염두에 두어야 할 사항입니다. 아무런 이유없이 갑자기 끊어 지거나 몇 가지 특수한 상황이 발생했을 때만 몇 시간 동안 잘 돌아가는 시뮬레이션은 부동 소수점 연산으로 인해 쉽게 발생할 수 있습니다.

+0

주셔서 감사합니다. – Rsh