2011-09-17 5 views
1

어제 왜 더블에 10 배의 0.10을 더하는 것이 int 1과 같지 않은지 질문했습니다. 왜 double 1.0이 int 1과 같은가요?

in VB Why (1 = 1) is False

나는 훌륭한 대답을 얻었다. 개요는 다음과 같습니다.

  • 부동 소수점 유형과 정수 유형은 이진 표현이 서로 다르기 때문에 직접 비교할 수 없습니다.
  • 도 1에 가까운 값이 될 수있는 부동 소수점 유형으로 0.1 열 번을 추가하는 결과가 아니라 정확히

나는 왜 지금 이유를 볼 수 있습니다. 그러나, 나는이 같은 경우 : 정말 1을 두 번 1.0 사이의 평등을 획득하고 int로이 경우

Dim d As Double 

    For i = 1 To 4 
     d = d + 0.25 
    Next 

    MsgBox(d) 'output 1 
    MsgBox(d = 1) 'True 
    MsgBox(1 - d) ' 0 
    Console.WriteLine(d) '1 

을 나는 d는 어떻게 든 것으로 기대 있도록 이중 만 근사치가 1에 가까운 값이라고 다음 생각 최초의 첫 번째 질문에서와 마찬가지입니다. 서로 다른 데이터 유형 (이 경우 이중 정수)을 직접 비교하는 것이 좋은 이유는 무엇입니까? 그리고 이번에는 평등을 얻는 이유는 무엇입니까 ??

+0

희미한 d를 double로, 희미한 i를 Int로 비교해보십시오. 이것은 틀린 것 같습니다. 프로그래머는 무엇이 할당되고 있는지를 알기 위해 더 깔끔한 코드 타입 캐스팅이 필요합니다. :) – doNotCheckMyBlog

답변

4

예, 복식은 일반적으로 aproximations입니다. 그러나 일부 숫자는 다른 숫자보다 효과가 좋습니다.

십진수와 똑같이 1/10 (0.1)이지만 1/3 (0.33333 ...)은 쓸 수 없습니다.

그래서 1/10은 1/10이 될 수없는 이진 부동 소수점 수로 정확히 변환 될 수 있습니다. 당신이 1/10의 조합, 1/100로 어떤 수를 쓸 수 그래서 만약

편집
진수 (부동 소수점) 숫자가 10의 거듭 제곱와 함께 작동, 1/1000 등 다음 (배수 허용) 10 진수로 정확히 그 숫자를 쓸 수 있습니다.

이진 부동 소수점 숫자의 경우 동일하게 작동하며 시퀀스는 1/2, 1/4, 1/8, 1/16 등입니다. 컴퓨터의 경우 정밀도에 제한이 있습니다. 일부 세부 사항 만 있습니다. 너무 작아 정확하게 표현할 수 없습니다.

+0

j/(2^k) 형식의 임의의 수를 추가 할 수 있습니다. 여기서 j와 k는 정수이고 부동 소수점으로 정확하게 표현할 수 있습니다 (j와 k의 최대 한도까지). – RBarryYoung

1

두 배는 정수를 정확하게 나타낼 수 있습니다. 그러나 특히 하나보다 작은 값을 사용할 때 여러 가지 방법으로 오류를 도입 할 수 있습니다. 예를 들어, 보통 1 정확하게 동일하지 X가 발생합니다 :

x = 1 
x = x/3 
x = x * 3 

그러나이 예에서는

는, x가 될 것입니다 정확히 3

x = 3 
x = x/3 
x = x * 3 

는 정수 값을 가질 더블을 기대한다면 , 가장 가까운 정수로 정확하게 반올림하기 위해 Round (x)를 사용할 수 있습니다.

If Round(x) = 1 Then... 

What Every Computer Scientist Should Know About Floating-Point Arithmetic 정말 좋은 (더블이 무엇이다) 부동 소수점 숫자의 설명과 오류가 있습니다.

관련 문제