본문 바로가기

프로그래밍/javascript(ES)

자바스크립트 Infinity 바로 앞의 크기 구하기

자바스크립트에는 숫자 형식의 값에 한계가 있습니다. 그 한계를 넘어서 더 값을 많이 저장하려고 할 경우에는 값이 변형되거나 손실 또는 Infinity로 취급되어 버리는데요. (Infinity로 취급될 경우에는 값을 완전히 잃어버리는 것이죠. 값의 한계에 대해서는 여기)


그래서 제가 궁금증이 하나 생겼습니다. Infinity로 취급되기 '바로 전' 한계의 값은 몇일까 이죠. 사실 저기 위에 링크를 걸어둔 글에 들어가 보면, Number.MAX_VALUE라는 최대값을 나타내주는 상수가 있습니다. 하지만 이 값은 e가 붙었고, JS에서 정한 최대 안전값을 넘었기에 값이 변형되거나 했을 수 있기에 정확하지 못하다는 판단이 들어, 직접 프로그램을 간단히 짜 보았습니다.



Infinity 바로 앞의 수 구하기

1
2
3
4
5
6
7
8
9
10
11
12
var JAM = "1";
 
while (((JAM + "0"- 0!= Infinity) JAM += "0";
 
for (var i = 0; i < JAM.length; i++) {
  while (((JAM.substring(0, i) + ((JAM.charAt(i) - 0+ 1+ JAM.substring(i + 1)) - 0!= Infinity) {
    JAM = (JAM.substring(0, i) + ((JAM.charAt(i) - 0+ 1+ JAM.substring(i + 1));
  }
}
console.log(JAM);
console.log(process.uptime()); //Only Node.js
 
cs


프로그램은 이런식으로 짰습니다.

일반적인 integer(정수) 형식으로 변수에 값을 담았을때는 변수의 내용이 변형되기 때문에, 일반적 정수가 아니라 글자로 바꿔서 JAM 변수에 값을 저장해둡니다. 그렇게 해두면, 글자에서 "-0"을 이용해 숫자로 바꿀때까지는 값을 보존할 수 있습니다.


첫번째 과정은 자릿수를 맞춰주는 것입니다. 0이 몇개 붙었는지 모르기에 Infinity가 되기 바로 전의 자릿수로 JAM변수를 맞춰줍니다.

그리고 두번째 과정은, 자리수만큼 for문을 돌려 문자를 한개씩 읽어나가고, 그 안에 있는 while문에서는 그 문자를 Infinity 바로 전의 숫자로 맞춰줍니다.

이런 과정을 거치고 나면, JAM에는 Infinity 바로 전의 값이 남게 됩니다. 이제 console에 JAM 값을 출력해 주면 되겠죠.


실행결과

Node.js로 실행한 결과입니다. 뒤에 뜨는 0.176이라는 값은 코드가 몇초동안 실행됬는지를 의미합니다. ( 일반 JS의 경우에는, 마지막 코드를 생략하고 실행하기를 바랍니다. )

179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497791

이로써 Infinity의 바로 앞 수는 위 값이라는 것을 알 수 있습니다. 콘솔에서 입력해보면, 이 값이 정확하다는 것을 알 수 있습니다.

위 값에서 1을 더한 숫자부터는, Infinity 취급이 됩니다. 실험이 성공적으로 완료된 것이죠.




쓸데없는 짓 같았는데, 생각보다 결과가 잘 나와서 재미는 있었던 것 같습니다. 여러분도 가끔 심심할땐 이런 짓을 해보는 것도 나쁘진 않을것같네요. 그럼 이만.