2005년 덧글 성금 38,830원(終) | 한님넷 | 게시판 | 메모판 | 프로필 | 읽을거리 | 클럽박스 | 이글루스 | 로그인  


오신 분은 반드시 읽어주세요.

  • 모든 저작물은 CCL(by-nc-nd)에 따라 사용하실 수 있습니다. 단, 회원제 사이트, 신문/잡지는 예외입니다.
  • 자소를 분해한 말, 통신체와 욕설 등의 비속어, 광고, 작성자 불명의 덧글은 사전 경고 없이 삭제될 수 있습니다. 줄 띄기 역시 임의 삭제 대상이며, 나눠 써야할 정도로 긴 덧글은 트랙백을 이용해주시기 바랍니다.
  • 유다롱씨와 그의 단체(?) 일원으로 명시된 사람의 접근은 형태와 깊이에 상관없이 완전히 거부합니다.

이것은 VC++의 오류?


테스트를 위해 작성한 소스 코드

#include<stdio.h>
#include<math.h>

void main()
{
  int x;
  int a,b;
  printf("by LOG10 fuction ");
  for(x=0;x<256;x++)
  {
    a = log10(abs(x))/log10(2);
    b = log10(abs(x+1))/log10(2);
    if(a!=b)
    {
      printf("log2(%d) = %d log2(%d) = %d ",x,a,x+1,b);
    }
  }
  printf(" ");
  printf("by LOG fuction ");
  for(x=0;x<256;x++)
  {
    a = log(abs(x))/log(2);
    b = log(abs(x+1))/log(2);
    if(a!=b)
    {
      printf("log2(%d) = %d log2(%d) = %d ",x,a,x+1,b);
    }
  }
  printf(" ");
  printf("log(8)=%f, log(2)=%f, log2(8)=%f by LOG
    log10(8)=%f, log10(2)=%f, log2(8)=%f by LOG10 ",
    log(8), log(2), log(8)/log(2), log10(8), log10(2), log10(8)/log10(2));
}

by 한님 | 2005/02/05 13:15 | DIP+C | 트랙백 | 덧글(4)

Commented by fC at 2005/02/06 16:38
VC++의 버그는 아니고, float이나 double에 흔히 있을 수 있는 문제. (int)(log(8)/log(2)) 와 (int)(float)(log(8)/log(2))는 값이 다를 수도 있어. 게다가 다른 math 라이브러리를 사용하는 경우(ex : Linux에서 gcc로 빌드하는 경우)는 결과가 이것과 또 다를 수도 있어.
Commented by 한님 at 2005/02/07 15:14
fC// 부동소수점 표시상 한계라면 아래쪽에서도 3.000000이 아니라 2.999999이라고 나왔어야 하는거 아닌가해서 저렇게 쓴거지.
Commented by fC at 2005/02/07 17:31
log의 프로토타입은 double log(double). printf를 사용할 때 조금 더 정확하게 출력을 해 봐.
printf("%1.16lf", log(8) / log(2));
그럼 2.9999999 ... 을 구경할 수 있을거야. :)
Commented by 한님 at 2005/02/13 21:27
fC// 오호.. 그랬던것이었군.
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지          다음 페이지 ▶