Splunk: 처리 가능한 수치의 범위를 조사해 보았습니다.

3305 단어 SPLSplunk
우연히 조사할 기회가 생겨서 필기를 했어요.
구현 환경: Splunk Free 8.2.2
Splunk에서는 숫자를 자주 사용합니다.
그리고 이'수치'는 항상 매우 큰 값이다.
그러나 실제로 스프링크가 처리할 수 있는'수치'의 범위는 한계가 있다.
다음 SPL을 실행해 보십시오.
pow는 곱셈을 나타내는 함수로 2를 몇 번 곱한 후의 값에 1을 더한 값을 계산한다.
Splunk
| makeresults count=100
| streamstats count AS CNT
| eval NUM = pow(2, CNT) + 1
| eval CHK = if(NUM % 2 = 1, "T", "F")
| where CHK = "F"
| head 1
| table CNT, NUM

종합하면 2의 53차례에 1을 더한 값은'2로 나뉘어 1을 남긴 값이 아니다', 즉'홀수가 아니다'다.
이것은 분명히 이상하다.
2의 53차는'90007199, 2544740992'이기 때문에 이 값 주변 수치의 다음 동작을 살펴본다.
Splunk
| makeresults count=10
| streamstats count AS CNT
| eval NUM = 9007199254740987 + CNT
| table CNT, NUM

마침'9007199, 2544740992'를 경계로 다음 동작이 이상하다는 걸 알게 됐다.
스핑크도 하나의 프로그램인 만큼 하나의 수치를 포함하는 상자는 당연히 한계가 있다.
이 상자의 크기를 보면 2의 53차 ='9천7199, 25740992'(약 9천조, 자릿수 16위)는 정수를 올바르게 처리할 수 있는 범위다.
빼기 방향도 결과와 같다.
Splunk
| makeresults count=10
| streamstats count AS CNT
| eval NUM = -9007199254740987 - CNT
| table CNT, NUM

반대로 아주 작은 값도 확인해 보세요.
다음 SPL을 실행해 보십시오.
아까와 반대로 1을 몇 번 또는 2로 나눈 값에 1을 더한 값을 계산해'1보다 큰 값인가'='1이 반올림되었는지 확인한다(참고로 여기서 계산된'1보다 큰 최소값과 1의 차이'를'컴퓨터 이프시온'이라고 부른다고 한다).
Splunk
| makeresults count=100
| streamstats count AS CNT
| eval NUM = pow(2, CNT * -1) + 1
| eval CHK = if(NUM > 1, "T", "F")
| where CHK = "F"
| head 1
| table CNT, NUM

2의 - 53차에 1을 더한 값은 1과 같다.2~53차 0.0억원 11...따라서 소수점 이하의 자릿수도 16자리 정도로 제한된다.
위와 같이 크거나 작은 값을 처리하는 경우는 많지 않고 있어도 작은 오차를 신경 쓰는 경우는 드물다.
그러나 장시간 통계에서 합계를 계산한 뒤 이렇게 큰 값이 나오거나 작은 값의 오차가 반복적으로 계산되는 과정에서 무시할 수 없는 반올림 오차가 생길 수 있다는 점에 유의해야 한다.
그나저나 이 처리 가능한 값의 범위를 감안하면 스핑크의 수치는'배정밀도 부동 소수점형'(표준규격 IEEE754-2008의'Binary64')의 형식을 채택한 것 같다(명확하게 확인되지는 않았지만).이 형식은 64비트 데이터 길이를 가지고 있는데 그 중에서 인코딩부는 1위, 지수부는 11위, 임시부는 52위이다.또한 표준'IEEE754-2008'에 부합하면 코딩부/지수부/잠정부와 수치의 관계는 다음과 같다(임시부는 소수임을 주의한다).
(-1)^{符号部}×2^{指数部-1023}×(1+仮数部)
또 표준규격인'IEEE754-2008'의'Binary64'에서 지수 부분의 모든 비트가 1이면 특수모드를 나타내는 값으로 유지했다.
따라서 지수부의 최대치는 $2^{11]-1=2046달러다.
소수 부분의 소수점이 1도 안 되기 때문에 $2^ {2046-1023+1} = 2^ {1024} 달러 이상의 수치는 "Binary64"로 표시할 수 없습니다.
Splunk는 이러한 값에 대해 어떻게 표현할까요?
답은 다음과 같다.
Splunk
| makeresults count=1
| eval NUM = pow(2,1024)
| table NUM

출력은 무한대입니다.
응, 나는 이렇게 큰 가격을 쓰지 않을 거라고 생각한다.

좋은 웹페이지 즐겨찾기