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

조회수 2522회

다른 사람이 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;
}

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개 정도 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)