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 답변
-
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
개 정도 있습니다.
댓글 입력