epsilone()에 대해서 질문이요!


다른 사람이 epsilone()을 써서 짠 코드를 읽고 있는데 관련 문서에서 epsilon()은 "double형에서 1보다 큰 숫자 중 가장 작은 숫자에서 1을 뺀 값"이라고 나옵니다.

그럼 epsilone()은 0보다 큰 숫자 중 가장 작은 숫자인가요? 아니면 (0, 0+epsilone) 범위 안에 double로 표현할 수 있는 값이 있나요?

소스코드

double someValue = ... //뭔가를 할당
if (someValue <  std::numeric_limits<double>::epsilon() && 
    someValue > -std::numeric_limits<double>::epsilon()) {
  someValue = 0.0;
}
  • 2016년 01월 15일에 작성됨

조회수 220


1 답변


좋아요
0
싫어요
채택취소하기

64-bit IEEE double은 1-bit sign, 52-bit mantissa, 11-bit exponent으로 이루어져 있습니다.

1은 1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^0이고,

1보다 큰 수중 가장 작은 수는 1.0000 00000000 00000000 00000000 00000000 00000000 00000001 × 2^0 = 1 + 2^-52 입니다.

그러니까 epsilon = (1 + 2^-52) - 1 = 2^-52 이지요.

(0, epilon) 범위 안에는 double로 표현할 수 있는 값이 엄청 많이 있습니다. 가장 작은 양수인 1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^-1022 = 2^-1022 부터 시작해서

이런 숫자들이 약 (1022 - 52 + 1)×2^52 = 4372995238176751616개 정도 있습니다.

  • 2016년 01월 15일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close