2011-12-01 5 views
-3

가능한 중복 :
Is JavaScript's Math broken?이상한 산술 정밀

나는 OCaml의 산술 정밀도의 샘 이상한 문제가 있습니다. 모양 :

# 1.1+.2.2;; 
- : float = 3.30000000000000027 

때만 발생합니다. something.1 + something.2. 누군가 그것을 시도 할 수 있을까요?

+9

그건 이상하지 않은데, 부동 소수점 숫자가 본질적입니다. 당신은 1000 번째 (야구장) 사용자입니다. – delnan

+10

[모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

답변

5

이것은 부동 소수점 값을 사용하는 현실입니다. 1.1은 정확히 2 자리 숫자로 10 진수로 표현되지만,이 값을 나타 내기 위해서는 무한 수의 2 진수가 필요합니다. 유한 개의 비트 수를 가진 이진수로 1.1을 저장하기 때문에 반올림 오류가 발생합니다.

1

Ocaml 플로트 번호는 IEEE754 배 정밀도입니다. 다른 프로그래밍 언어에서도 동일한 동작을 보입니다. 아마도 bignums (Ocaml에서는 제공하지 않음)을 부동 상태로 만들려고합니다.

컴퓨터는 항상 계산기와 마찬가지로 유한 정밀 기본 숫자를가집니다.